如何在打字稿中重载Node.js Writable end方法

我创build了一个从Node.jsstream库类扩展的类,在这个类中做了一些特殊的事情。

import * as stream from 'stream'; export class PipeWritable extends stream.Writable { ... public end(): void; public end(chunk: any, cb?: Function): void; public end(chunk: any, encoding?: string, cb?: Function): void { super.end(); } } 

这导致错误:
error TS2394: Overload signature is not compatible with function implementation

重载方法的参数结构从@types/node/index.d.ts 1:1复制。

我知道打字稿不支持方法重载,但是如果你声明了模块,你可以这样做,就像在Node.js模块stream中看到的那样:

 declare module "stream" { export class Writable extends Stream implements NodeJS.WritableStream { ... end(): void; end(chunk: any, cb?: Function): void; end(chunk: any, encoding?: string, cb?: Function): void; ... } } 

所以我的问题,我怎么可以覆盖stream.Writable方法end()

在你的代码片段中,这些是重载签名:

 public end(): void; public end(chunk: any, cb?: Function): void; 

这是实现签名:

 public end(chunk: any, encoding?: string, cb?: Function): void { super.end(); } 

实现签名与重载签名不兼容。

第一个重载是不兼容的,因为它没有参数,实现签名有一个非可选的chunk参数。

第二个重载是不兼容的,因为它的第二个参数是一个可选的Function并且与可选的string不兼容。

您必须提供一个与所有重载兼容的签名的实现。 例如:

 // The overload signatures: public end(): void; public end(chunk: any, cb?: Function): void; public end(chunk: any, encoding?: string, cb?: Function): void; // The implementation: public end(...args: any[]): void { super.end(...args); } 

请注意,当函数具有重载签名时,TypeScript仅将函数调用与重载签名进行匹配; 考虑执行签名。