Versão do TypeScript: 3.4.0-dev.201xxxxx
Termos de pesquisa:
A ordem das chaves dos tipos mapeados foi perdida
Código
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
Comportamento esperado:
O mapeamento sobre os tipos deve preservar a ordem das chaves
Comportamento real:
O mapeamento de tipos preserva o "tipo", mas a ordem das chaves é perdida ao executar o operador T[keyof T]
Assuntos relacionados:
A ordem sindical não é algo com que você deva contar para nada. @RyanCavanaugh mencionou isso quando uniões para tuplas foram discutidas aqui :
Primeiro, a ordem sindical não é algo que possamos permitir que seja observável. Internamente, as uniões são armazenadas como uma lista classificada de tipos (esta é a única maneira eficiente de determinar rapidamente as relações entre eles), e a chave de classificação é um ID interno gerado de forma incremental. O resultado prático disso é que dois programas extremamente semelhantes podem gerar ordens de união muito diferentes, e a mesma união observada em um contexto de serviço de linguagem pode ter uma ordem diferente de quando observada em um contexto de linha de comando, porque a ordem em que os tipos são criados é simplesmente a ordem em que são verificados.
Comentários muito úteis
A ordem sindical não é algo com que você deva contar para nada. @RyanCavanaugh mencionou isso quando uniões para tuplas foram discutidas aqui :