2017-08-19 9 views
1

Node.jsストリームライブラリクラスから拡張したクラスを作成しました。Node.jsをオーバーロードする方法タイプスクリプトの書き込み可能な終了メソッド

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(); 
    } 

} 

これはエラーにつながる:@types/node/index.d.tsから1:オーバーロードされたメソッドの
error TS2394: Overload signature is not compatible with function implementation

引数構造を1コピーします。

私はtypescriptですが、メソッドのオーバーロードをサポートしていませんが、知っているあなたは、モジュールを宣言する場合は、Node.jsのモジュールの流れに見ることができるようにあなたは、そのような何かを行うことができます。

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; 
     ... 
    } 
} 

だから私の質問は、どのようにIストリームを上書きできます。書き込み可能なメソッドend()?スニペットで

+0

[documentation](https://www.typescriptlang.org/docs/handbook/functions.html)の* Overloads *セクションをご覧ください。要点は、TypeScriptが一致するオーバーロードを探すとき、関数の実装のシグネチャが考慮されないことです。また、関数の実装の署名は、すべてのオーバーロードと互換性がなければなりません。 – cartant

+0

私は[ドキュメンテーションのオーバーロードのセクション](https://www.typescriptlang.org/docs/handbook/functions.html#overloads)を複数回勉強しましたが、受け入れられない宣言で何かできることは奇妙です実装で。私は、モジュール宣言が既存のjavascript(またはネイティブ)ソリューションとの "リンク"として使用されているという事実が原因だと思います。 –

答えて

1

、これらは、過負荷の署名です:

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

そして、これは実装の署名です:

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

実装の署名が過負荷署名のいずれかと互換性がありません。

最初のオーバーロードはパラメータを持たず、実装シグネチャにはオプションのchunkパラメータがないため互換性がありません。

2番目のパラメータがオプションのFunctionであり、オプションのstringと互換性がないため、2番目のオーバーロードは互換性がありません。

すべてのオーバーロードと互換性のあるシグネチャを実装する必要があります。たとえば、:

関数にオーバーロードシグネチャがある場合、TypeScriptは関数呼び出しをオーバーロードシグネチャのみと一致させます。実装署名はではなく、とみなされます。

+0

応答に感謝します。おそらく、あなたの応答を編集し、 'super.end(.. args);を' super.end(... args);に変更することができます。しかし、もう一つ質問があります。今、私は、すべて(... args:any)が受け入れられるので、私はthis.end(1,2,3,4,5)と呼ぶことができると期待します。しかし、あなたのソリューションは3つの宣言のうちの1つだけを受け入れます(そうする必要があります)。なぜ説明できますか? –

+0

これは上記の私のコメントで指摘した重要なポイントです。オーバーロードシグネチャがある場合、関数の呼び出しを過負荷に一致させると、実装シグネチャは**考慮されません**。 – cartant

関連する問題