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:
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.
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í :