如何扩展@ types / express请求界面?

时间:2018-06-28 15:27:33

标签: typescript

尽管人们提出了类似的问题,但这些答案都无法解决我的问题。我在TypeScript 2.9.2中,并且试图将上下文对象添加到Express Request对象中。我想在.d.ts文件中完成此操作。

我目前所拥有的是: express.d.ts

declare namespace Express {
    interface Request {
        context: any;
    }
}

但是,由于在“请求”类型上不存在“属性”上下文,因此无法编译。

在我的其他文件中,Webstorm声称请求类型是从正确的文件中导入的。

给我的印象是,我可以利用声明合并的优势,而不必导入或导出类型定义。

这不正确吗?

2 个答案:

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