我在一个打字稿项目中使用passport。passport的DefinitelyTyped类型定义覆盖了包含< code>user属性的Express请求。但是它将用户定义为一个空界面:
索引.d.ts
declare global {
namespace Express {
...
// tslint:disable-next-line:no-empty-interface
interface User {}
interface Request {
...
user?: User;
...
}
}
}
然而,在我的整个应用程序中,我希望req.user
是这种类型的接口:
interface User {
id: number
username: string,
profilePicture: string,
name: string
}
我厌倦了在整个应用程序中编写req.user作为user|null
。我可以直接重写定义文件中的接口定义,但这似乎是不好的做法,修改<code>node_modules</code>中的文件,如果我更新类型模块,该文件可能会被覆盖。
有没有办法在我的 src 文件夹中编写覆盖 Express.User
的定义文件?我尝试将定义文件复制并修改到我的 src 目录,但它说
全局范围的增强只能直接嵌套在外部模块或环境模块声明中
如果没有声明全局
tsc仍然将req.user
视为空接口。
我必须在tsconfig.json
中包含什么配置才能拾取此覆盖?
合并同一范围内的接口声明。也就是说,以下
interface A {
name: string;
}
interface A {
id: number;
}
声明一个接口,即< code>A,具有两个属性< code>name和< code>id。
因此,只需使用护照使用的相同技术来调整类型
// ensure file is parsed as a module
export {}
declare global {
namespace Express {
interface User {
id: number,
username: string,
profilePicture: string,
name: string
}
}
}