Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 为什么这两种映射的元组类型不相等? type NumbersTuple=[number,number,number]; 类型WrapKey={ [K-in-keyof-T]:{key:T[K]}; }; 类型WrappedNumbers1=WrapKey; 类型WrappedNumber={ [K in keyof NumbersTuple]:{key:NumbersTuple[K]}; };_Typescript_Tuples_Mapped Types - Fatal编程技术网

Typescript 为什么这两种映射的元组类型不相等? type NumbersTuple=[number,number,number]; 类型WrapKey={ [K-in-keyof-T]:{key:T[K]}; }; 类型WrappedNumbers1=WrapKey; 类型WrappedNumber={ [K in keyof NumbersTuple]:{key:NumbersTuple[K]}; };

Typescript 为什么这两种映射的元组类型不相等? type NumbersTuple=[number,number,number]; 类型WrapKey={ [K-in-keyof-T]:{key:T[K]}; }; 类型WrappedNumbers1=WrapKey; 类型WrappedNumber={ [K in keyof NumbersTuple]:{key:NumbersTuple[K]}; };,typescript,tuples,mapped-types,Typescript,Tuples,Mapped Types,为什么WrappedNumbers1和WrappedNumbers2不相等?这是因为类型是如何实例化的吗?我希望它们是一样的。注意:按照惯例,TypeScript中的非原始类型名称是用大写字母而不是snake_大小写的。因此,在下文中,我将引用WrapKey而不是wrap_key,T而不是T,等等 这被认为是TypeScript中的一个bug;有关更多信息,请参阅。当在TypeScript 3.1中添加对的支持时,似乎只有在映射到您的WrapKey类型中的T等泛型类型的键时,才完成此操作,而在

为什么
WrappedNumbers1
WrappedNumbers2
不相等?这是因为类型是如何实例化的吗?我希望它们是一样的。

注意:按照惯例,TypeScript中的非原始类型名称是用大写字母而不是snake_大小写的。因此,在下文中,我将引用
WrapKey
而不是
wrap_key
T
而不是
T
,等等


这被认为是TypeScript中的一个bug;有关更多信息,请参阅。当在TypeScript 3.1中添加对的支持时,似乎只有在映射到您的
WrapKey
类型中的
T
等泛型类型的键时,才完成此操作,而在映射到特定类型的键(如
Numbers
时,则未完成此操作

当您映射特定类型的键时,您将看到旧的TS-3.1之前的行为,其中数组的所有属性都被映射,包括
length
push()
等方法,从而导致非常奇怪且大多无用的类型。解决方法将涉及使用中间泛型类型参数


如果您希望看到此问题得到修复,您可能希望转到该问题并对其进行一次检查,看起来他们更改了类型参数的行为,请检查此PR-。感谢您的深入了解!另外请注意,我已经编辑了我问题中的代码,以使用传统的PascalCase
type NumbersTuple = [number, number, number];

type WrapKey<T> = {
  [K in keyof T]: { key: T[K] };
};

type WrappedNumbers1 = WrapKey<NumbersTuple>;

type WrappedNumbers2 = {
  [K in keyof NumbersTuple]: { key: NumbersTuple[K] };
};