从元组内容推断类型

Infer type from tuple contents

假设我有一个通用元组类型:

type MyTuple<A, B> = [A, B]

下面的作品,因为我给了它通用类型:

const thing2: MyTuple<number, string> = [20, 'hello']

我想这样用,但是报错:

const thing1: MyTuple = [20, 'hello'] // -> Generic type 'MyTuple' requires 2 type argument(s).

我不明白为什么在这种情况下它需要通用参数 - 例如,在使用 map 时我很少需要指定通用类型。

Code here.

您定义了一个没有默认值的泛型。

MyTuple 没有它的 2 个泛型参数就没有意义。


type MyTuple<A = number, B = string> = [A, B]

const thing1: MyTuple = [20, 'hello']

例如,此示例有效,但它可能不是您要查找的内容。

generic 类型的类型参数,如 MyTuple<A, B> do not 由编译器推断。

microsoft/TypeScript#30120, which was closed as a duplicate of the longstanding open feature request at microsoft/TypeScript#26242 中有人请求此功能。也许在 TypeScript 的某个未来版本中,您可以编写 const thing1: MyTuple<infer, infer> = [20, 'hello'] 并且它会按您想要的方式工作。但目前(TS4.7 及以下版本)这是不可能的。


另一方面,泛型 函数 的类型参数在您调用它们时确实会被编译器推断出来(例如数组上的 map() 方法) .这意味着您可以通过创建一个通用的辅助身份函数来解决您的问题:

type MyTuple<A, B> = [A, B]
const myTuple = <A, B>(t: MyTuple<A, B>) => t;

而不是写 const x: MyTuple<XXX,YYY> = y,你写 const x = myTuple(y):

const thing1 = myTuple([20, 'hello']);
// const thing1: MyTuple<number, string>

现在 thing1 已根据需要推断为 MyTuple<number, string> 类型。拥有此 no-op 功能可能不是最佳选择,但它是我们目前最接近您想要的功能。

Playground link to code