使用TypeScript覆盖res.end

dom*_*kyi 5 node.js express typescript

我需要使用下一个签名覆盖方法res.end:

res.end = (data: any, encoding: string)
Run Code Online (Sandbox Code Playgroud)

但是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)
Run Code Online (Sandbox Code Playgroud)

我曾尝试传递空的回调,但并没有帮助:

res.end = (data: any, encoding: string, callback: `() =>void`): void
Run Code Online (Sandbox Code Playgroud)

hoa*_*gdv 2

将您的函数类型设置为any,这意味着它可以转换(或分配)为任何类型。

尝试这个

res.end = ((data: any, encoding: string): void => { }) as any;
Run Code Online (Sandbox Code Playgroud)

更新

您可以创建一个扩展的类型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) => {

  }
};
Run Code Online (Sandbox Code Playgroud)