Version TypeScript: 3.4.0-dev.201xxxxx
Termes de recherche:
Ordre des clés des types mappés perdu
Code
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
Comportement attendu:
Le mappage sur les types doit conserver l'ordre des clés
Comportement réel:
Le mappage sur les types préserve le "type", mais l'ordre des clés est perdu lors de l'exécution T[keyof T]
opérateur
Problèmes liés:
L’ordre syndical n’est pas quelque chose sur lequel vous devriez compter pour quoi que ce soit. @RyanCavanaugh l'a mentionné lorsque les unions aux tuples ont été discutées ici :
Premièrement, l'ordre syndical n'est pas quelque chose que nous pouvons jamais permettre d'observer. En interne, les unions sont stockées sous la forme d'une liste triée de types (c'est le seul moyen efficace de déterminer rapidement les relations entre eux), et la clé de tri est un ID interne généré de manière incrémentielle. Le résultat pratique de ceci est que deux programmes extrêmement similaires peuvent générer des ordres d'union très différents, et la même union observée dans un contexte de service de langage peut avoir un ordre différent de celui observé dans un contexte de ligne de commande, car l'ordre dans lequel les types sont créés est simplement l'ordre dans lequel ils sont vérifiés.
Commentaire le plus utile
L’ordre syndical n’est pas quelque chose sur lequel vous devriez compter pour quoi que ce soit. @RyanCavanaugh l'a mentionné lorsque les unions aux tuples ont été discutées ici :