typescript - 如何解决 Passport-http-bearer TypeScript 重载类型问题?

标签 typescript

"use strict"

import passport from "passport"
import { Strategy } from "passport-http-bearer"

passport.use(
  "users",
  new Strategy({ passReqToCallback: true }, (req, token, done) => {
    if (token !== "foo") {
      return done(null, false)
    }
    return done(null, {}, { scope: "user" })
  })
)
[ts] src/authenticate.ts(8,46): error TS7006: Parameter 'req' implicitly has an 'any' type.
[ts] src/authenticate.ts(8,51): error TS7006: Parameter 'token' implicitly has an 'any' type.
[ts] src/authenticate.ts(8,58): error TS7006: Parameter 'done' implicitly has an 'any' type.

使用npm install @types/passport-http-bearer安装的类型。

// Type definitions for passport-http-bearer 1.0.1
// Project: https://github.com/jaredhanson/passport-http-bearer
// Definitions by: Isman Usoh <https://github.com/isman-usoh>
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
// TypeScript Version: 2.3

/// <reference types="passport"/>
/// <reference types="express" />

import passport = require("passport");
import express = require("express");

interface IStrategyOptions {
    scope?: string | Array<string>;
    realm?: string;
    passReqToCallback?: boolean;
}
interface IVerifyOptions {
    message?: string;
    scope: string | Array<string>;
}

interface VerifyFunction {
    (token: string, done: (error: any, user?: any, options?: IVerifyOptions | string) => void): void;
}

interface VerifyFunctionWithRequest {
    (req: express.Request, token: string, done: (error: any, user?: any, options?: IVerifyOptions | string) => void): void;
}

declare class Strategy implements passport.Strategy {
    constructor(verify: VerifyFunction);
    constructor(options: IStrategyOptions, verify: VerifyFunction);
    constructor(options: IStrategyOptions, verify: VerifyFunctionWithRequest);

    name: string;
    authenticate(req: express.Request, options?: Object): void;
}

我的直觉是,没有使用 constructor(options: IStrategyOptions, verify: verifyFunctionWithRequest); 重载,因为我不知道它如何知道 passReqToCallbacktrue。这是类型定义的错误吗?

最佳答案

您关于过载导致问题的说法是正确的。我的猜测是,推理选择了第一个对参数的上下文类型有效的重载,但随后发现该函数有太多参数。重新排序参数也无法解决此问题,因为带有 VerifyFunction 的版本本身将变得无法访问。

不幸的是,解决方法并不好,您可以显式指定参数,也可以使用 Parameters 来避免键入所有参数:

passport.use(
  "users",
  new Strategy({ passReqToCallback: true }, (...[req, token, done]: Parameters<VerifyFunctionWithRequest>) => {
    if (token !== "foo") {
      return done(null, false)
    }
    return done(null, {}, { scope: "user" })
  })
);

您还可以使用类型断言,但这可能会导致错误的返回值。

关于typescript - 如何解决 Passport-http-bearer TypeScript 重载类型问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62603379/

相关文章:

javascript - Vue Typescript Konva。 Canvas onClick 抛出 "Uncaught SyntaxError: Function statements require a function name"

javascript - JS 如何从 JSON 键中获取值?

javascript - 如何在 JavaScript/TypeScript 中创建具有非唯一键的 Map?

javascript - 使用 TypeScript 创建新的 sql.js 数据库

typescript - 是否可以在 TypeScript 导入中指定 webpack 加载程序?

function - typescript :如何在没有TS2339错误的情况下将函数名称获取为字符串

javascript - 是否可以在 Angular 项目中的 javascript 文件和 typescript 文件之间共享相同的全局变量?

javascript - 在 Typescript 中使用外部 JS-Library(基本原语图)

forms - 如何设置嵌套 formBuilder 组的值

typescript - 为什么不解析函数参数的类型,对象( typescript )的哪个元素?