2017-08-04 5 views
0
function f<T, U>(foo: T, bar: U) { 
} 

f(1, "x"); // OK, inferes <number, string> 
f<number>(1, "x"); // ERROR: Expected 2 type arguments, but got 1. 

最初の型引数だけを渡して、TypeScriptが他の型を推論できるようにするにはどうすればよいですか?最初の型引数のみを指定する

+0

試してください:f (1、 "x"); –

+0

[TypeScriptジェネリック:引数型推論]の可能な複製(https://stackoverflow.com/questions/38687965/typescript-generics-argument-type-in​​ference) –

答えて

2

TypeScriptは型パラメータの部分的な推論を提供しません。型パラメータはすべて明示的に定義するか、コンパイラに処理させます。

ただし、型引数のデフォルト値を設定することができます:@ジョー・クレイ氏

function f<T, U = any>(foo: T, bar: U) { 

} 

f<number>(1, "x"); 
1

として、あなたはジェネリックをオプションにするには、デフォルトのパラメータを設定することができますが、コンパイラは、あなたが望むようにnot infer themます。

私が使用した回避策は、機能を複数のものに(curryingを介して)分割し、それぞれに1つの汎用パラメータを使用することです。たとえば、次のように

function f<T,U>(foo:T, bar: U): [T, U] { 
    return [foo, bar]; 
} 

がこれを可能に

function curriedF<T>(foo: T) { 
    return function <U>(bar: U): [T, U] { 
     return [foo, bar] 
    } 
} 

次のようになります。

var z = curriedF(1)("x"); // [number, string] 
var z = curriedF<number>(1)("x"); // also [number, string] 

お役に立てば幸いです。がんばろう。

+1

まずJavaScriptに型を追加してから、カリングを追加します私たちがOCamlを使ってみんなをだましてしまったことを知ってください。そして、すべては世界で正しいです:p –

+0

非常に面白いアプローチ、ありがとうございます。 – kraftwer1

関連する問題