Donc, il y a une astuce que je trouve dans les typescript pour transformer un type d'objet en une union discriminée en mappant le type en paire clé-valeur puis en créant un type qui peut être n'importe quelle valeur dans la carte en utilisant le type keyof
. Voici un exemple simple:Raison de [typof T] dans les génériques ayant une sémantique différente d'un type codé en dur?
type SourceType =
{
foo: number,
bar: string
};
type MapWithKey<T> = {[P in keyof T]: { key: P, value: T[P] }}
type DescriminatedUnion = MapWithKey<SourceType>[keyof SourceType];
//The DescriminatedUnion now has the following type
DescriminatedUnion ≡ {key:"foo",value:string} | {key:"bar",value:number}
Ceci est très utile si vous souhaitez spécifier une union discriminée très grand mais quand vous essayez de faire de cette construction vous complètement générique retrouvez avec un autre type.
type MakeDescriminatedUnion<T> = MapWithKey<T>[keyof T];
type DescriminatedUnion = MakeDescriminatedUnion<SourceType>
//The DescriminatedUnion now has the followin type
DescriminatedUnion ≡ {key:"foo"|"bar",value:number|string}
Ceci devrait être du même type mais, pour une raison quelconque, il ne l'est pas. J'ai essayé de parcourir la documentation dactylographiée pour trouver un raisonnement pour ce comportement mais je ne peux pas. Est-ce que quelqu'un sait le raisonnement derrière cette différence? Ou mieux encore quelqu'un sait-il un moyen de contourner ce comportement et de le rendre totalement générique?
[Cette question] (https://stackoverflow.com/questions/43898999/creating-a-discriminated-union-using-the-property-names-of-another-type) est très similaire, voici [github problème] (https://github.com/Microsoft/TypeScript/issues/15756), et [voici le correctif] (https://github.com/Microsoft/TypeScript/pull/18042) – artem
Merci! C'est beaucoup plus que ce à quoi je m'attendais. @artem –