【发布时间】:2016-04-07 06:38:57
【问题描述】:
我正在开发基于express 并使用 TypeScript 1.7 编写的节点服务器。我正在使用一些特定于项目的中间件,它们扩展了现有的快速请求或响应接口,但我还不能让它完全工作(没有 tsc 抱怨在 req 或 res 中找不到 X)。我找到了其他 questions 关于这个问题,但它们要么已经过时(我猜),要么解决方案不是直截了当的。
我查看了existing middleware 的定义,但如果不手动编写单独的 d.ts 文件并在 typings/tsd.d.ts 中引用它们,我就无法让它工作。这是我的设置:
// middleware/foobar.ts
declare module Express {
export interface Request {
foobar?: string;
}
}
/* my project-related middleware extends the request by `foobar` */
export = function(req: Express.Request, res, next) {
req.foobar = 'FooBar';
next();
};
// main.ts
import express = require('express');
var app = express();
app.use(require('./middleware/foobar'));
app.get('/foobar', (req, res) => {
/* tsc: Property 'foobar' does not exist on type 'Request' */
res.send(req.foobar);
});
扩展 express 的请求和响应接口的最佳做法是什么?如果可能,无需编写单独的 d.ts、在类型目录中操作任何内容或使用 /// <reference path="..." /> cmets。
【问题讨论】:
-
您可以让 tsc 使用定义标志为您的代码生成 d.ts 文件。你所要做的就是你的代码应该实现/扩展请求/响应接口/类
-
@toskv 如果我将 tsconfig.json 中的
declaration设置为 true,tsc 会抱怨exports = function语句,因为它是“使用私有名称 'Express.Request'”,即使我在此处将<reference>添加到 express.d.ts 文件中。编译后(使用tsc或tsc -w观察变化),有main.d.ts,但由于上述原因,middleware.d.ts 丢失了。并且 main.ts 仍在抱怨缺少 req.foobar ... -
这听起来更像你不应该能够扩展 express.request 因为它被定义为私有。 :(
-
但是现有快速中间件的类型(以express-session 为例)可以正常工作。我使用
tsc install express-session --save调查了它是如何工作的。它添加了对 typings/tsd.d.ts 的引用,但是一旦我删除了该引用,它就再也找不到req.session了。而且我不想自己修改 tsd.d.ts,因为下一个 tsd 命令可能会删除我的硬编码引用。 -
你不应该有,难道你没有 tsconfig.json 和 package.json 文件来管理依赖关系吗?
标签: express typescript typescript1.7