从元组内容推断类型
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
时我很少需要指定通用类型。
您定义了一个没有默认值的泛型。
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 功能可能不是最佳选择,但它是我们目前最接近您想要的功能。
假设我有一个通用元组类型:
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
时我很少需要指定通用类型。
您定义了一个没有默认值的泛型。
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 功能可能不是最佳选择,但它是我们目前最接近您想要的功能。