仅指定第一个类型参数

时间:2017-08-04 14:41:50

标签: typescript

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推断另一个?

2 个答案:

答案 0 :(得分:4)

正如@ Joe-Clay所说,您可以设置默认参数以使泛型可选,但编译器将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]

希望有所帮助;祝你好运。

更新2018-10-19

部分推理取得了一些进展(使用*标记来标记&#34;请为我推断这个&#34;)它可能出现在TypeScript 3.2或其附近。有关详细信息,请参阅this pull request

答案 1 :(得分:3)

TypeScript不提供类型参数的部分推理 - 要么全部显式定义它们,要么让编译器处理它。

但是,您可以为类型参数设置默认值:

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

}

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