FP-TS Typescript 错误:类型“Left”不可分配给类型“None”

FP-TS Typescript error: Type '"Left"' is not assignable to type '"None"'

提问人:user1790300 提问时间:11/18/2023 最后编辑:user1790300 更新时间:11/18/2023 访问量:16

问:

我是 fp-ts 的新手,正在尝试使用 typescript、express 和 fp-ts 编写一个 jwt 策略函数。运行 npx tsc -p tsconfig.json 后,我现在收到一条错误消息,我无法确定问题可能是什么。当然,在处理 done 函数和 done 返回 void 时,我试图从 jwt 策略中返回 None,不确定这是否是最好的方法。

智威汤逊策略功能:

createJwtStrategy: (req: express.Request, jwt_payload: any, done: VerifiedCallback) => tryCatch<ErrorBase, None>(
        pipe(
            jwt_payload?.userId as string,
            interactor.evaluateJwtStrategy,
            chain((user: Option<LoggedInUser>) => {
                if (user._tag === "None") {
                    return right((done(null, false) as unknown) as None);
                }

                req.user = {
                    userId: user.value.userId,
                    firstName: user.value.firstName,
                    lastName: user.value.lastName,
                    emailAddress: user.value.emailAddress,
                    profilePicUrl: user.value.profilePicUrl
                };
                return right((done(null, req.user) as unknown) as None);
            })
        ),
        (reason: any) => {
            return left((done(reason) as unknown) as None);
        }
    )

错误信息:

error TS2345: Argument of type 'TaskEither<ErrorBase, None>' is not assignable to parameter of type 'LazyArg<Promise<None>>'.
  Type 'Promise<Either<ErrorBase, None>>' is not assignable to type 'Promise<None>'.
    Type 'Either<ErrorBase, None>' is not assignable to type 'None'.
      Type 'Left<ErrorBase>' is not assignable to type 'None'.
        Types of property '_tag' are incompatible.
          Type '"Left"' is not assignable to type '"None"'.

113         pipe(
            ~~~~~
114             jwt_payload?.userId as string,
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
... 
131             })
    ~~~~~~~~~~~~~~
132         ),
  1. 错误消息指向的问题是什么,似乎很神秘,诚然我是 fp-ts 的菜鸟?
  2. 当“无”是_tag的有效类型时,为什么错误消息指示“属性'_tag'的类型不兼容”?
  3. 如果这是处理需要处理 void 的函数的错误方法,那么在这种情况下,更好的方法是什么?
  4. 在 tryCatch 中使用管道被认为是不好的做法吗?我无法找到使用这种方法的任何场景,但它似乎非常适合这种情况?

更新:我设法通过在tryCatch中删除管道来解决问题,并在管道中添加了一个双映射,这似乎解决了这个问题。将更新修复程序。

TypeScript Express Passport.js FP-TS

评论


答: 暂无答案