2017-07-29 5 views
3

私はTypescriptを使用しています。2.3.3Typescriptでは、どのようにして、オーバーロードでベア機能のインターフェイスを実装できますか?

私が書いているコード用の素敵なAPIを作成しようとしていますので、Typescriptのジェネリックで可能なことを試しています。

一般的な型の関数を呼び出し、その型を使用してユーザーに選択肢を提示できたいと考えています。その中には、異なる署名を持つ関数があります。

これまでの私の試みです。

私は2つの裸の関数シグネチャ(I開発者に提示したい二つのオプション)とのインタフェース宣言:

interface api<T1> { 

    <T2>(second: T2): { 
    first: T1 
    second: T2; 
    }; 

    <T2, T3>(second: T2, third: T3): { 
    first: T1 
    second: T2; 
    third: T3; 
    }; 

} 

およびIは用い、各関数シグネチャの実装を含む関数を作成しますそれに渡されたジェネリック型パラメータ:

const test = <TFirst>(first: TFirst) : api<TFirst> => { 

    const impl1 = <T2>(second: T2) => ({ 
    first, second 
    }); 

    const impl2 = <T2, T3>(second: T2, third: T3) =>({ 
    first, second, third 
    }); 

    return ...? 
}; 

でも、私はどここれらの実装を割り当てたり、APIの仕様を満たすリターンオブジェクトを作成する方法は考えて、持っていません。

これも可能ですか?

答えて

1

可能です。

interface api<T1> { 

    <T2>(second: T2): { 
    first: T1; 
    second: T2; 
    }; 

    <T2, T3>(second: T2, third: T3): { 
    first: T1; 
    second: T2; 
    third: T3; 
    }; 
}; 

function createApi<T1>(first: T1): api<T1> { 

    function impl<T2>(second: T2): { first: T1; second: T2; }; 
    function impl<T2, T3>(second: T2, third: T3): { first: T1; second: T2; third: T3; }; 
    function impl<T2, T3>(second: T2, third?: T3): { first: T1; second: T2; third?: T3; } { 
    if (third === undefined) { 
     return { first, second }; 
    } 
    return { first, second, third }; 
    } 

    return impl; 
} 

const test = createApi<number>(1); 
console.log(test(2)); 
console.log(test(2, 3)); 

createApi機能だけで内側の、オーバーロードされた関数を返す:あなたはこのような何かを行うことができます。

TypeScriptオーバーロードの詳細については、オーバーロードセクションのthe documentationを参照してください。

関連する問題