2017-08-04 56 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

Try: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),每個功能都有一個通用參數。例如:

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,然後我們添加currying,在你之前知道我們已經欺騙了所有人使用OCaml,並且全世界都是正確的:p –

+0

非常有趣的方法,謝謝。 – kraftwer1

相關問題