仅指定第一个类型参数

问题描述 投票:0回答:3
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 推断另一个?

typescript
3个回答
10
投票

正如 @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]

希望有帮助;祝你好运。


更新2018-10-19

部分推理方面取得了一些进展(使用

*

 标志来标记“请为我推断这一点”),它可能会出现在 TypeScript 3.2 或类似版本中。  请参阅
此拉取请求了解更多信息。


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

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

function f<T, U = any>(foo: T, bar: U) { } f<number>(1, "x");
    

0
投票
只是@jcalz 答案的更易读的变体。

假设我们有函数:

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)
    
© www.soinside.com 2019 - 2024. All rights reserved.