Typescript: 将数组强制转换为联合+映射数组类型,但不保留类型顺序

创建于 2019-05-07  ·  1评论  ·  资料来源: microsoft/TypeScript


TypeScript版本: 3.4.0-dev.201xxxxx


搜寻字词:

映射类型的键顺序丢失

代码

type Initial = [1, 2, 3, 4]

type FindReplace<T extends any[], Find, Replace> = {
  [K in keyof T]: T[K] extends Find ? Replace : T[K]
}

// Map over array and replace '2'
type ResultArray = FindReplace<Initial, 2, 'was 2'>
// => [1, "was 2", 3, 4]

// Now accessing the array values using [number], the type
// order is lost. This matters because now when the union is later
// cast as a intersection, the types are in the wrong order
type Result = ResultArray[number]
// => 1 | 3 | 4 | "was 2

预期行为:

在类型上进行映射应保留关键顺序

实际行为:

在类型上进行映射会保留“类型”,但是在执行T[keyof T]运算符时会丢失键顺序

相关问题:

Question

最有用的评论

联合订单不是您应该依靠的东西。 @RyanCavanaugh这里讨论与元组的工会时提到了这

首先,工会秩序不是我们可以允许观察到的东西。 在内部,联合存储为类型的排序列表(这是快速确定它们之间的关系的唯一有效方法),并且排序键是递增生成的内部ID。 实际的结果是,两个极其相似的程序可以生成完全不同的联合顺序,并且在语言服务上下文中观察到的同一个联合可能与在命令行上下文中观察到的同一个联合有不同的顺序,因为创建类型的顺序是确定的只需检查它们的顺序即可。

>所有评论

联合订单不是您应该依靠的东西。 @RyanCavanaugh这里讨论与元组的工会时提到了这

首先,工会秩序不是我们可以允许观察到的东西。 在内部,联合存储为类型的排序列表(这是快速确定它们之间的关系的唯一有效方法),并且排序键是递增生成的内部ID。 实际的结果是,两个极其相似的程序可以生成完全不同的联合顺序,并且在语言服务上下文中观察到的同一个联合可能与在命令行上下文中观察到的同一个联合有不同的顺序,因为创建类型的顺序是确定的只需检查它们的顺序即可。

此页面是否有帮助?
0 / 5 - 0 等级