使用 Typescript 扩展快速响应对象的正确方法

Posted

技术标签:

【中文标题】使用 Typescript 扩展快速响应对象的正确方法【英文标题】:Proper way to extend express Response Object using Typescript 【发布时间】:2019-04-18 04:02:22 【问题描述】:

我目前正在从事一个涉及 Typescript 3+、express 4+ 和 node 8+ 的项目。例如,如果 API 检测到错误,我正在尝试扩展 express 的 Response 对象以发送 HTTP 状态代码。如果不使用中间件来定义我要添加的响应扩展函数,我似乎无法弄清楚如何扩展响应对象。我希望能够只使用响应原型来定义我想要添加的函数,但我不知道或无法弄清楚这是否可能。这是我所做的:

projectA/declarations/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】:

express-serve-static-coreResponse 成员只是一个接口,而不是一个可以扩展原型的类,因此当您将 Response 作为值引用时,TypeScript 会将其解析为不相关的 Response 类是 DOM API 的一部分。您要扩展的原型对象是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 应该在哪里导入?我们应该在哪里声明模块?

以上是关于使用 Typescript 扩展快速响应对象的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

从 typescript 中的 API 响应正确转换日期

使用 TypeScript 扩展 Express Request 对象

如何在 Typescript 中正确扩展泛型类?

使用 TypeScript 扩展元素原型

Mobx6React + Typescript 实践

Mobx6React + Typescript 实践