2017-08-07 9 views
1

以下の両方の呼び出しと互換性のある署名を作成しようとしています。最初のものは正常に動作するようですが、2番目のものはSupplied parameters do not match any signature of call target.と言います。何か案は?ジェネリックによる関数のオーバーロード:「提供されたパラメータが呼び出しターゲットのシグネチャと一致しません」

interface I1 { 
    name: string; 
} 

interface I2 { 
    age: number; 
} 

function set<T, KT extends keyof T>(arg1: KT, arg2?: undefined): (value: T[KT]) => void; 
function set<T, KT extends keyof T, U, KU extends keyof U>(arg1: KT, arg2: KU): (value: U[KU]) => void { 
    // ... 
    return null; 
} 

set<I1, "name">("name"); // OK 
set<I1, "name", I2, "age">("name", "age"); // ERROR: "Supplied parameters do not match any signature of call target." 

答えて

0

これは、最後の機能が過負荷候補にカウントされないためです。すべてを処理するはずの実装です。

次の作品は:

interface I1 { 
    name: string; 
} 

interface I2 { 
    age: number; 
} 

function set<T, KT extends keyof T>(arg1: KT, arg2?: undefined): (value: T[KT]) => void; 
function set<T, KT extends keyof T, U, KU extends keyof U>(arg1: KT, arg2: KU): (value: U[KU]) => null; 
function set<T, KT extends keyof T, U, KU extends keyof U>(arg1: KT, arg2: KU): (value: U[KU]) => null { 
    // ... 
    return null; 
} 

const x = set<I1, "name">("name"); // OK 
const y = set<I1, "name", I2, "age">("name", "age"); // Now OK 
+0

二時間、あなたは私の一日行われました!あなたは本当に時の最も強力な忍です。 – kraftwer1

関連する問題