我目前正在从事一个涉及Typescript 3+,并表示4+和node 8+的项目。我正在尝试扩展express的Response对象,以在例如API检测到错误时发送HTTP状态代码。我似乎无法弄清楚如何在不使用中间件定义我要添加的Response扩展函数的情况下扩展Response对象。我希望能够仅使用Response原型来定义我想添加的功能,但是我不知道或不知道这是否可行。这是我所做的:
projectA / clarifications / express.extensions.d.ts:
import * as e from "express"
declare global {
namespace Express {
interface Response {
send100(): e.Response;
}
}
}
export {}
在下面是我想要定义原型函数定义的地方,但是它不能编译...
projectA / extensions / ResponseExtensions.ts
import * as e from "express";
import { Response } from "express-serve-static-core";
Response.prototype.send100 = function(): e.Response {
var response = this as Response;
response.status(100).end();
}
然后最终消耗...
ProjectB / Server.ts
import * as express from "express"
app.get('/getData'
request: express.Request,
response: express.Response) : void {
// yada yada...
response.send100();
}
我似乎无法获得ResponseExtensions.ts脚本进行转换,而我看到的唯一实现此方法的方法是在定义函数的地方运行中间件,但这对于每个单个请求都会发生。是否有我正在探索的选项,或者中间件是唯一的选择?
谢谢。
答案 0 :(得分:0)
Response
的{{1}}成员只是一个接口,而不是可以扩展原型的类,因此当您将express-serve-static-core
引用为值时,TypeScript会将其解析为一个不相关的Response
类,它是DOM API的一部分。您要扩展的原型对象是Response
模块的response
成员(请参见this answer)。 express
中没有声明它,但是您可以自己声明它:
@types/express
然后在declare module "express" {
const response: Response;
}
中,您可以编写:
ResponseExtensions.ts