如何扩展@types/快递请求接口?



虽然人们问过类似的问题,但这些答案都没有解决我的问题。我在 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 知道这个接口必须由外部代码使用,并且它将正确合并到现有声明中。

这不是真正的导出,因为它来自模块(在顶层(,因为命名空间本身是declared,而不是exported。所以你只需像往常一样从模块导入它:

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();
}