Typescript: Conversion d'un tableau en types de tableaux union + mappés ne conservant pas l'ordre des types

Créé le 7 mai 2019  ·  1Commentaire  ·  Source: microsoft/TypeScript


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:

Question

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 :

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.

>Tous les commentaires

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.

Cette page vous a été utile?
0 / 5 - 0 notes