Typescript: Conversión de matriz a unión + tipos de matriz mapeados que no conservan el orden de tipos

Creado en 7 may. 2019  ·  1Comentario  ·  Fuente: microsoft/TypeScript


Versión de TypeScript: 3.4.0-dev.201xxxxx


Términos de búsqueda:

Se perdió el orden de claves de los tipos asignados

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

Comportamiento esperado:

La asignación de tipos debe preservar el orden de las claves

Comportamiento real:

La asignación de tipos conserva el "tipo", pero el orden de las claves se pierde al realizar el operador T[keyof T]

Asuntos relacionados:

Question

Comentario más útil

El orden sindical no es algo con lo que debas contar para nada. @RyanCavanaugh mencionó esto cuando las uniones a tuplas se discutieron aquí :

Primero, el orden sindical no es algo que podamos permitir que sea observable. Internamente, las uniones se almacenan como una lista ordenada de tipos (esta es la única forma eficaz de determinar rápidamente las relaciones entre ellas) y la clave de ordenación es un ID interno que se genera de forma incremental. El resultado práctico de esto es que dos programas extremadamente similares pueden generar ordenamientos de unión muy diferentes, y la misma unión observada en un contexto de servicio lingüístico puede tener un ordenamiento diferente que cuando se observa en un contexto de línea de comandos, porque el orden en el que se crean los tipos es simplemente el orden en el que se comprueban.

>Todos los comentarios

El orden sindical no es algo con lo que debas contar para nada. @RyanCavanaugh mencionó esto cuando las uniones a tuplas se discutieron aquí :

Primero, el orden sindical no es algo que podamos permitir que sea observable. Internamente, las uniones se almacenan como una lista ordenada de tipos (esta es la única forma eficaz de determinar rápidamente las relaciones entre ellas) y la clave de ordenación es un ID interno que se genera de forma incremental. El resultado práctico de esto es que dos programas extremadamente similares pueden generar ordenamientos de unión muy diferentes, y la misma unión observada en un contexto de servicio lingüístico puede tener un ordenamiento diferente que cuando se observa en un contexto de línea de comandos, porque el orden en el que se crean los tipos es simplemente el orden en el que se comprueban.

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

seanzer picture seanzer  ·  3Comentarios

Roam-Cooper picture Roam-Cooper  ·  3Comentarios

bgrieder picture bgrieder  ·  3Comentarios

Antony-Jones picture Antony-Jones  ·  3Comentarios

manekinekko picture manekinekko  ·  3Comentarios