2017-05-16 2 views
0

裸のことnoImplicitAnyがオンです。関数のオーバーロードを使用するとき、実装で使用する型はどれですか? (暗黙的なanyはありません)

機能を過負荷のこの単純な例があります:

interface FUNC { 
    (x: number, f: (y: number) => number): number; 
    (x: string, f: (y: string) => string): string; 
} 

const func: FUNC = function(x, func) { 
    return func(x); 
} 

const result = func('dfd', x => x + '3'); 

あなたがxfuncが暗黙のうちいずれかのタイプを持っていることでしょう。 (this linkを使用して "noImplicitAny"をオンにしてください)

xfuncのどちらを入力しますか? (今、私は彼らに明示的に何かを与えている、私はより良い解決策があると思う、おそらく私は間違っている)

ありがとうございます!

答えて

1

をインターフェースを変更して汎用タイプのパラメータを持つことができます。

interface FUNC<T> { 
    (x: T, f: (y: T) => T): T; 
} 

それを次のように使用してください:

// Parameter types will be inferred based on type parameter. 
const numberFunc: FUNC<number> = function(x, func) { 
    return func(x); 
} 

const stringFunc: FUNC<string> = function(x, func) { 
    return func(x); 
} 
const numberResult = numberFunc(1, x => x + 1); // Can't pass strings here 
const stringResult = stringFunc("1", x => x + "1"); // Can't pass numbers here 
+1

これは正しい答えです。残念ながら私は問題の複雑さを十分に説明していませんでした。私は新しい質問を作成します。ありがとう – Ben

0

funcだけの数と文字列を受け入れた場合、あなたはそれを共用体型与える必要があります:あなたのオーバーロードは唯一のタイプに基づいて異なる場合

const func: FUNC = function<T>(x: T, func: (x: T) => T) { 
    return func(x); 
} 
0

:あなたはジェネリックを使用することができ

x: number | string

関連する問題