使用Typescript扩展表达响应对象的正确方法

时间:2018-11-15 05:18:09

标签: node.js typescript express

我目前正在从事一个涉及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脚本进行转换,而我看到的唯一实现此方法的方法是在定义函数的地方运行中间件,但这对于每个单个请求都会发生。是否有我正在探索的选项,或者中间件是唯一的选择?

谢谢。

1 个答案:

答案 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
相关问题