Правильный способ расширения объекта Express Response с использованием Typescript - PullRequest
0 голосов
/ 15 ноября 2018

В настоящее время я работаю над проектом, который включает Typescript 3+ и Express 4+ и узел 8+.Я пытаюсь расширить объект Response Express для отправки кодов состояния HTTP, если API обнаруживает ошибку, например.Кажется, я не могу понять, как расширить объект Response, не используя Middleware для определения расширенной функции Response, которую я хочу добавить.Я хотел бы иметь возможность просто использовать прототип Response для определения функций, которые я хочу добавить, но я не знаю или не могу понять, возможно ли это.Вот что я сделал:

projectA / декларации / 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 голосов
/ 15 ноября 2018

Член 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...