TypeScript报错:Passport实例赋值给Authenticator时'this'类型不兼容
问题原因
这个TypeScript报错是@types/passport的类型定义特性导致的:Authenticator接口内的use等方法声明返回值为this类型,允许子类继承Authenticator时返回子类型实例。你直接将new Passport()生成的实例显式标注为Authenticator类型时,TS无法确定实例的this上下文和通用Authenticator接口的this兼容,就会抛出类型不匹配的错误。
解决方案
方案1:省略显式类型标注(最推荐)
new Passport()返回的实例本身类型是TS可以自动推导的,不需要强行标注为Authenticator,直接写即可:
import { Passport } from 'passport'; const alternativePassport = new Passport();
方案2:显式标注为Passport实例类型
如果需要保留显式类型声明,使用Passport类型或者InstanceType取构造函数的实例类型即可:
import { Passport } from 'passport'; // 写法1 const alternativePassport: Passport = new Passport(); // 写法2 const alternativePassport: InstanceType<typeof Passport> = new Passport();
方案3:适配接收可选passport参数的函数
针对你的业务场景,函数参数直接用Passport类型,默认值赋值为passport.default即可同时兼容默认实例和自定义实例:
import passport, { Passport } from 'passport'; // 自定义函数的类型定义 function handleAuth(customPassport: Passport = passport.default) { // 业务逻辑 } // 调用时可以传自己生成的实例,也可以不传用默认值 handleAuth(alternativePassport); handleAuth();
兜底方案:类型断言
如果以上方案都不满足你的特殊场景,可通过类型断言强制兼容,不到万不得已不推荐使用:
import { Passport, Authenticator } from 'passport'; const alternativePassport = new Passport() as unknown as Authenticator;
内容的提问来源于stack exchange,提问作者Max Gordon
相关产品推荐
相关产品推荐

