網站搜尋

node.js - Passport 認證在 Typescript express 應用中不返回與 express 相容的類型


我正在嘗試在我的 Typescript Express 應用中使用 passport.authenticate 作為中介軟體函數:

router.get('/spotify', passport.authenticate('spotify'))

passport.authenticate 在這裡返回的是 Typescript 的 'any' 類型,可能是為了保證與多個 HTTP 服務框架的兼容性。然而,在調試時,函數簽名與 Express 使用的 RequestHandler 定義相匹配。

因為 authenticate 返回的是 'any' 類型,typescript-eslint 會報錯(no-unsafe-argument),因為我將一個 'any' 變量賦值給 RequestHandler 參數。這可以通過將 authenticate 的類型斷言為 RequestHandler 來避免。但據我所知,類型斷言是一種不好的做法。

我嘗試過類型縮小,但據我所知,將 'any' 變量縮小為函數類型是不可能的。

唯一的其他方法是否是使用包含在 Authenticator 介面中的框架方法?對於看似簡單的任務,這似乎複雜得多。

答案#1

我也遇到過這個問題,而對我有效的方法是強制指定 RequestHandler 類型。所以要將這應用到你的程式碼中,那將是

import { RequestHandler} from 'express';

router.get(
  '/spotify',
  passport.authenticate('spotify') as RequestHandler
);