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 推断另一个?
正如 @Joe-Clay 所说,您可以设置默认参数以使泛型可选,但编译器将不会按照您想要的方式推断它们。
我使用的一种解决方法是将函数拆分为多个函数(通过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]
希望有帮助;祝你好运。
*
标志来标记“请为我推断这一点”),它可能会出现在 TypeScript 3.2 或类似版本中。 请参阅此拉取请求了解更多信息。
但是,您可以设置类型参数的默认值:
function f<T, U = any>(foo: T, bar: U) {
}
f<number>(1, "x");
假设我们有函数:
const createFooBar = <F, B>(foo: F, bar: B) = {...}
如果我们只想提供第一个泛型类型,可以这样做:
const withFoo<F>() => {
return {
createFooBar: <B>(foo: F, bar: B) => {...}
}
}
用途:
const footer = withFoo<F>().createFooBar(foo, bar)