如何为passport.js扩展自定义User类型?
问题原因与解决办法
为什么你的代码不生效?
在.d.ts文件的declare namespace Express内部写import语句,会把整个文件变成模块文件,而非全局声明文件。此时你定义的Express.User只是模块内的局部接口,无法和Passport定义的全局Express.User完成类型合并,自然起不到扩展作用。
正确的实现方式
方法1:用类型导入(TypeScript 3.8及以上支持)
把import放到命名空间外部,使用import type导入类型(避免引入不必要的运行时代码):
// express_augmentation.d.ts import type MyUser from '../models/user'; declare namespace Express { interface User extends MyUser {} }
方法2:模块引用语法(兼容低版本TS)
如果你的TypeScript版本较低,可以直接在命名空间内通过模块引用获取类型:
// express_augmentation.d.ts declare namespace Express { type MyUser = import('../models/user').default; interface User extends MyUser {} }
方法3:给类配套导出接口(更规范)
如果MyUser是类,建议同时导出对应的接口,用接口扩展会更清晰:
// models/user.ts export interface IUser { id: string; email: string; // 其他属性... } export class MyUser implements IUser { id: string; email: string; // 类的逻辑实现... }
然后在声明文件中扩展:
// express_augmentation.d.ts import type { IUser } from '../models/user'; declare namespace Express { interface User extends IUser {} }
验证效果
修改完成后,再编写passport.serializeUser代码时,user.id这类属性会被TypeScript正确识别,不会再抛出“Property does not exist on type 'User'”的错误。
内容的提问来源于stack exchange,提问作者qnilab
相关产品推荐
相关产品推荐

