使用TypeScript扩展Express Response对象的正确方式

4
我目前正在处理一个涉及Typescript 3+、Express 4+和Node 8+的项目。我试图扩展Express的Response对象,例如,如果API检测到错误,则发送HTTP状态码。但是,我似乎无法找出如何在不使用中间件的情况下扩展Response对象,以定义我想要添加的Response扩展函数。我希望能够只使用Response原型来定义我想要添加的函数,但我不知道或无法弄清楚是否可能。这是我做过的事情: projectA/declarations/express.extensions.d.ts:
import * as e from "express"

declare global {
    namespace Express {
        interface Response {
            send100(): e.Response;
        }
    }
}

export {}

以下是我想要定义原型函数的方式,但这并不编译...
项目A/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
< p > express-serve-static-coreResponse 成员只是一个接口,而不是一个带有原型可以扩展的类,因此当您将 Response 作为值引用时,TypeScript 将其解析为与 DOM API 的无关 Response 类。您想要扩展的原型对象是 express 模块的 response 成员(请参见 this answer)。它没有在 @types/express 中声明,但您可以自己声明:

declare module "express" {
    const response: Response;
}

然后在 ResponseExtensions.ts 中,你可以写:

import * as e from "express";
import { Response } from "express-serve-static-core";

e.response.send100 = function(): e.Response {
    var response = this as Response;
    response.status(100).end();
}

嗨,@Matt McCutchen,您能告诉我们如何实现您的示例吗?ResponseExtensions.ts 应该在哪里导入?我们应该在哪里声明模块? - Vincent Guyard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接