【问题标题】:How to fix "No overload matches this call." error when using passport.serializeUser?如何修复“没有重载匹配此调用”。使用passport.serializeUser时出错?
【发布时间】:2021-06-25 05:36:43
【问题描述】:

我正在使用 TypeScript 开发 passport.serializeUser

passport.serializeUser((user: User, done) => {
    done(null, user.id)
});

这是我得到的错误:

No overload matches this call.
  Overload 1 of 2, '(fn: (user: User, done: (err: any, id?: unknown) => void) => void): void', gave the following error.
    Argument of type '(user: import("/Users/minseokim/Documents/dev/project/my-todo/models/user").default, done: (err: any, id?: unknown) => void) => void' is not assignable to parameter of type '(user: Express.User, done: (err: any, id?: unknown) => void) => void'.
      Types of parameters 'user' and 'user' are incompatible.
        Type 'User' is missing the following properties from type 'User': id, email, password, nickname, and 31 more.
  Overload 2 of 2, '(fn: (req: IncomingMessage, user: User, done: (err: any, id?: unknown) => void) => void): void', gave the following error.
    Argument of type '(user: User, done: (err: any, id?: unknown) => void) => void' is not assignable to parameter of type '(req: IncomingMessage, user: User, done: (err: any, id?: unknown) => void) => void'.
      Types of parameters 'user' and 'req' are incompatible.
        Type 'IncomingMessage' is missing the following properties from type 'User': id, email, password, nickname, and 30 more.

【问题讨论】:

  • 您需要提供更多信息。 serializeUser 的类型定义是什么?似乎该方法有两个重载,并且它们都不匹配您传入的内容。 User 的类型来自哪里等等。也许一个小的打字稿游乐场 (typescriptlang.org/play) 将有助于显示您的错误

标签: typescript express passport.js


【解决方案1】:

通过在./types/passport.d.ts 文件中使用此代码来扩展声明文件上的接口以添加更多重载。

import { User } from '../models/Users' // export interface User { _id: string, ... }

declare module 'passport' {
  interface Authenticator {
    serializeUser<TID>(fn: (user: User, done: (err: any, id?: TID) => void) => void): void;
  }
}

然后用这个配置你的./tsconfig.json

{
  "compilerOptions": {
    "typeRoots": ["./types"],
    ...
  }
}

最后,您的代码应该可以正常工作。

passport.serializeUser((user: User, done) => {
    done(null, user.id)
});

请记住,您也可以改用user: any 来防止出现此错误。

【讨论】:

    猜你喜欢
    • 2020-09-13
    • 1970-01-01
    • 2020-02-18
    • 1970-01-01
    • 2020-08-28
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    • 2020-12-10
    相关资源
    最近更新 更多