尽管人们提出了类似的问题,但这些答案都无法解决我的问题。我在TypeScript 2.9.2中,并且试图将上下文对象添加到Express Request对象中。我想在.d.ts
文件中完成此操作。
我目前所拥有的是:
express.d.ts
declare namespace Express {
interface Request {
context: any;
}
}
但是,由于在“请求”类型上不存在“属性”上下文,因此无法编译。
在我的其他文件中,Webstorm声称请求类型是从正确的文件中导入的。
给我的印象是,我可以利用声明合并的优势,而不必导入或导出类型定义。
这不正确吗?
答案 0 :(得分:3)
只需稍作修改即可>
declare namespace Express {
export interface Request {
context: any;
}
}
当我们在名称空间内定义接口(或实际上,从常量到类的任何东西)时,默认情况下,它仅对同一名称空间的成员可见,如handbook中所述。通过添加export
,我们使TypeScript知道该接口必须由外部代码使用,并且可以正确地合并到现有声明中。
由于名称空间本身是declare
d,而不是export
ed,因此这不是真正的导出,因为它是从模块(在顶层)进行的。因此,您只需照常从模块中导入它即可:
import * as express from 'express';
答案 1 :(得分:0)
使用当前版本的 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();
}