Переопределить res.end с TypeScript - PullRequest
5 голосов
/ 10 мая 2019

Мне нужно переопределить метод res.end следующей подписью:

res.end = (data: any, encoding: string)

Но TS возвращает следующую ошибку:

Type '(data: any, encoding: string) => void' is not assignable to type '{ 
(cb?: (() => void) | undefined): void; 
(chunk: any, cb?: (() => void) | undefined): void; 
(chunk: any, encoding: string, cb?: (() => void) | undefined): void; 
}'.ts(2322)

Я пытался передать пустой обратный вызов, но это не помогло:

res.end = (data: any, encoding: string, callback: `() =>void`): void

Ответы [ 2 ]

2 голосов
/ 10 мая 2019

Проблема

Ваша первоначальная подпись не проходит проверку компилятора, потому что функция end имеет такую ​​перегрузку:

end(cb?: () => void): void;
end(chunk: any, cb?: () => void): void;
end(chunk: any, encoding: string, cb?: () => void): void;

Компилятор предупреждает вас, что во время выполнения вынеобходимо проверить, какая из перегрузок используется.

Решение

Вот подпись, которая является типобезопасной.Он проверяет, какой из трех аргументов является обратным вызовом, а затем действует соответственно.

import { Response } from 'express';

const handler = (req: Request, res: Response) => {

  res.end = (arg1: Function | any, arg2?: Function | string, arg3?: Function) => {

    if (typeof arg1 === 'function') {
      // end(cb?: () => void): void;
    }

    if (typeof arg2 === 'function') {
      // end(chunk: any, cb?: () => void): void;
    }

    if (typeof arg3 === 'function') {
      // end(chunk: any, encoding: string, cb?: () => void): void;
    }
  }
};
2 голосов
/ 10 мая 2019

Сделайте ваш тип функции равным any, это означает, что он может конвертироваться (или назначаться) в любой тип.

Попробуйте это

res.end = ((data: any, encoding: string): void => { }) as any;

Обновление

Выможет сделать тип, который расширяет express.Response, он переопределяет end метод (метод NodeJS.WritableStream).

import { Request, Response, Handler } from 'express';

type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>

interface MyResponse extends Omit<Response, "end"> {
  end: (data: any, encoding: string) => void;
}

const handler: Handler = (req: Request, res: MyResponse) => {
  res.end = (data: any, encoding: string) => {

  }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...