【问题标题】:Why are these two mapped tuple types not equal?为什么这两个映射元组类型不相等?
【发布时间】:2021-03-01 20:29:56
【问题描述】:
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] };
};

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

【问题讨论】:

标签: typescript tuples mapped-types


【解决方案1】:

这被认为是 TypeScript 中的错误;请参阅microsoft/TypeScript#27995 了解更多信息。当 TypeScript 3.1 中为 mapped arrays and tuples 添加了支持时,似乎只有在映射 generic 类型的键时才会这样做,如 TWrapKey&lt;T&gt; 类型一样,而不是映射到特定类型,例如Numbers

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

如果您希望看到此问题已得到解决,您可能需要转到该问题并给它一个 ?,或者如果您认为它特别引人注目,请描述您的用例。不过,这是一个相当老的问题,它位于the backlog,这意味着它不会在任何即将发布的版本中得到修复。所以实际上,我不希望看到它很快得到解决。

【讨论】:

  • 感谢您的洞察力!另请注意 - 我已编辑问题中的代码以使用传统的 PascalCase
猜你喜欢
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
  • 2016-03-19
  • 2019-10-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多