passport.js 中完成的打字稿静态类型是什么?

What is the typescript static type for done in passport.js?

在 passport.js 中有一个 done 函数,为此使用的正确类型是什么?

例如,

passport.use(new HeaderAPIKeyStrategy(
      { header: 'Authorization', prefix: 'Api-Key ' },
      false,
      function(apikey: string, done: <<WHAT GOES HERE>> ) {
        User.findOne({ apikey: apikey }, function (err, user) {
          if (err) { return done(err); }
          if (!user) { return done(null, false); }
          return done(null, user);
        });
      }
    ));

用什么类型替换 'WHAT GOES HERE' 文本?

我看到您正在使用 passport-headerapikey,它是 passport.js 的 third-party 扩展 - 幸运的是,它已经用 TypeScript 编写了。

但无论如何,make sure you're using the latest @types for passport.js

Going by the public source code on GitHubHeaderAPIKeyStrategy的构造函数的定义是:

constructor(
    header           : { header: string, prefix: string },
    passReqToCallback: boolean,
    verify           : (apiKey: string, verified: (err: Error | null, user?: Object, info?: Object) => void, req?: Request) => void
) 

我看到 verify 参数的签名很啰嗦。我很惊讶他们没有使用 type x = y 语句来提高可读性。

但您可以定义自己的:

type VerifiedUserOrErrorFunc = ( err: Error | null, user?: Object, info?: Object ) => void;
type VerifyCallback          = ( apiKey: string, verified: VerifiedUserOrErrorFunc, req?: Request ) => void;

// So the constructor would be:
/*
constructor(
    header           : { header: string, prefix: string },
    passReqToCallback: boolean,
    verify           : VerifyCallback
)
*/

所以这应该有效。请注意,没有 done 函数。只是您为所有结果(错误、not-found、成功)调用的 verified 回调。另请注意,与 Passport.js 的其他 Strategy 对象不同,HeaderAPIKeyStrategy 似乎不使用异步 Promises(因为回调所有 return void)。

type VerifiedUserOrErrorFunc = ( err: Error | null, user?: Object, info?: Object ) => void;
type VerifyCallback          = ( apiKey: string, verified: VerifiedUserOrErrorFunc, req?: Request ) => void;

const strategyVerifyCallback = function( apikey: string, verified: VerifiedUserOrErrorFunc, req?: Request ): void {
    
    User.findOne( { apikey: apikey }, function( err, user ) {
        if( err ) {
            verified( err );
        }
        else if( user ) {
            verified( /*err*/ null, user );
        }
        else {
            verified( new Error( "User not found" ) );
        }
    } );
};

const strategy = new HeaderAPIKeyStrategy(
    /* header           : */ { header: 'Authorization', prefix: 'Api-Key ' },
    /* passReqToCallback: */ false,
    /* verify           : */ strategyVeriyCallback
);

passport.use( strategy );