虽然人们问过类似的问题,但这些答案都没有解决我的问题。我在 TypeScript 2.9.2 中,我正在尝试将上下文对象添加到快速请求对象。我想在.d.ts
文件中执行此操作。
我目前拥有的是这个:express.d.ts
declare namespace Express {
interface Request {
context: any;
}
}
但是,它不会编译,因为类型"请求"上不存在"属性上下文"。
在我的其他文件中,Webstorm声称请求类型是从正确的文件导入的。
我的印象是我可以利用声明合并,而不必导入或导出类型定义。
这是不正确的吗?
只需稍作修改即可使其正常工作:
declare namespace Express {
export interface Request {
context: any;
}
}
当我们在命名空间中定义一个接口(或者实际上,从常量到类的任何内容(时,默认情况下它仅对同一命名空间的成员可见,如手册中所述。通过添加export
我们让 TypeScript 知道这个接口必须由外部代码使用,并且它将正确合并到现有声明中。
这不是真正的导出,因为它来自模块(在顶层(,因为命名空间本身是declare
d,而不是export
ed。所以你只需像往常一样从模块导入它:
import * as express from 'express';
使用当前版本的 TypeScript,您无需创建.d.ts
文件。
import express from "express";
export type MyRequest = express.Request & {
context?: any;
};
然后使用它来代替常规请求对象:
app.use(function (req: MyRequest, res: Response, next: NextFunction) {
req.context = {};
next();
}