为什么这两个映射的元组类型不相等?
Why are these two mapped tuple types not equal?
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] };
};
为什么 WrappedNumbers1
和 WrappedNumbers2
不相等?是由于类型是如何实例化的吗?我本来希望他们是一样的。
这被认为是 TypeScript 中的一个错误;请参阅 microsoft/TypeScript#27995 for more information. When support was added in TypeScript 3.1 for mapped arrays and tuples,这似乎仅在映射 generic 类型的键(如 T
时在您的 WrapKey<T>
类型中完成,而不是在映射时完成特定 类型的键,例如 Numbers
.
当您映射特定类型的键时,您将看到旧的 TS-3.1 之前的行为,其中映射了数组的 all 属性,包括 length
和push()
之类的方法,导致非常奇怪且大多无用的类型。解决方法是改用中间泛型类型参数。
如果你想看到这个问题得到解决,你可能想解决那个问题并给它一个或描述你的用例,如果你认为它特别引人注目。不过,这是一个相当古老的问题,它在 the backlog 上,这意味着它不会在任何即将发布的版本中得到修复。所以实际上,我不希望很快看到它得到解决。
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] };
};
为什么 WrappedNumbers1
和 WrappedNumbers2
不相等?是由于类型是如何实例化的吗?我本来希望他们是一样的。
这被认为是 TypeScript 中的一个错误;请参阅 microsoft/TypeScript#27995 for more information. When support was added in TypeScript 3.1 for mapped arrays and tuples,这似乎仅在映射 generic 类型的键(如 T
时在您的 WrapKey<T>
类型中完成,而不是在映射时完成特定 类型的键,例如 Numbers
.
当您映射特定类型的键时,您将看到旧的 TS-3.1 之前的行为,其中映射了数组的 all 属性,包括 length
和push()
之类的方法,导致非常奇怪且大多无用的类型。解决方法是改用中间泛型类型参数。
如果你想看到这个问题得到解决,你可能想解决那个问题并给它一个或描述你的用例,如果你认为它特别引人注目。不过,这是一个相当古老的问题,它在 the backlog 上,这意味着它不会在任何即将发布的版本中得到修复。所以实际上,我不希望很快看到它得到解决。