2017-04-17 4 views
0

TypeScript 2.2では、定義されたインターフェイスコールシグネチャによる「オーバーロード」機能が使用されていました。複数のコールシグネチャを持つTypeScriptインターフェイス

それに取り組み、「クラッキング」した後、ここに投稿する価値があると思いました。私が始めた

問題は、たとえば、だった:

interface Func1 { 
    (num1: number, num2: number): number; 
    (str1: number, str2: string): string; 
} 

function F1(num1: number, num2: number): number { 
    return num1 + num2; 
} 

const f1: Func1 = F1; 
console.log(f1(1, 2)); 

しかしFunc1F1機能を受け入れることができないため、コンパイラはそれを通過しませんでした。

私は過負荷をかけたいと思っています。私は何をすべきかわかりません。

以下の回答を参照してください。

答えて

2

私はかなりオーバーロードすることができることがわかった。 TypeScriptのオーバーロードは他のJavaScriptコードと変わらないC++のように、のいずれかではなく、に実装する必要があります。関数ですべてのオプションを受け入れる必要があります。例えば

interface Func1 { 
    (v1: number, v2: number): number; 
    (v1: string, v2: string): string; 
} 

const f1: Func1 = (v1, v2): any => { 
    return v1 + v2; 
}; 
console.log(f1("1", "2")); 
console.log(f1(1, 2)); 

機能f1あなたが強いタイプを設定した場合、それが原因のタイプがあなたをブロックします、インタフェースの呼び出し署名をオーバーロードのすべてのオプションのための型を持っていると仮定は、キャスト可能ではありません。この例のようにnumberはキャスト可能ではなく、stringになります。

また、インターフェイスコールシグネチャのオーバーロードを使用する複数の関数を作成し、それらをf1に渡して、一致する場合は合格します。あなたの関数がすべてのインタフェース呼び出しシグネチャを処理できることを確認してください。

クラスを使用する場合、または関数のパラメータが上記の例のように単純でない場合、typeofを使用してすべてのオプションを制御することが重要です。

願っています。

+0

'typeof'は「シンプル」型でのみ意味があります。あなたがそうした場合、あなたは悪いAPIを書いています。あなたのクラスを 'instanceof'ではないものを使ってあなたのAPIを呼び出すことができますし、あなたはそれを防ぐことができません。 –

関連する問題