Typescript: Casting array to union + array mapeado não preservando a ordem

Criado em 7 mai. 2019  ·  1Comentário  ·  Fonte: microsoft/TypeScript


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:

Question

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 :

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.

>Todos os comentários

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.

Esta página foi útil?
0 / 5 - 0 avaliações