如何在打字稿中重载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仅将函数调用与重载签名进行匹配; 不考虑执行签名。