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

lvloss

我目前正在从事一个涉及Typescript 3+,并表示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 {}

下面是我想像这样定义原型函数定义的地方,但这还没有编译...

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

谢谢。

马特·麦考森

Response成员express-serve-static-core只是一个接口,而不是您可以扩展的带有原型的类,因此当您将其Response称为值时,TypeScript会将其解析Response为DOM API的不相关类。您要扩展的原型对象是模块response成员express(请参见此答案)。它没有在中声明@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();
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章