Ich habe das so verstanden wie:
type GenericExample<T> = T extends (infer U) ? U : 'bar';
entspricht:
type GenericExample<T> = T extends T ? T : 'bar';
Aber wenn die Dinge aufwändiger werden, beschwert sich TypeScript:
type Types = 'text' | 'date' | 'articles' | 'params';
type MyExperiment<Type extends Types> = { t : Type };
type MyExperimentsUnion = Types extends (infer U) ? MyExperiment<U> : never;
// Type 'U' does not satisfy the constraint 'Types'.
// Type 'U' is not assignable to type '"params"'.
Ich möchte also fragen, warum dies falsch ist: In diesem speziellen Fall sollte eine Verteilung über die Gewerkschaft stattfinden, also sollte der abgeleitete U
Typ text
dann date
und so weiter sein. Was bedeutet es also T extends (infer U)
wirklich und wann wäre es angebracht, es zu verwenden?
quelle
infer
Schlüsselworts kenne, aber ich habe diese seltsame Frage gestellt, weil ich festgestellt habe, dass sieT extends (infer U)
in einem bedingten Typ gültig ist. Ich war darüber überrascht und begann zu untersuchen.U
. Was soll dasMyExperiment<U>
sein? Ich meine,U
muss "Unterklasse" von seinTypes
, aber Typoskript kann nicht genau bestimmen, was ist,U
da Sie keinen Typ übergeben (es ist kein generischer Typ), und ich verstehe nicht, warum es standardmäßig sein sollteTypes
. Ich denke, das ist einer der Gründe, warum Sie den Fehler erhalten, obwohl ich der Meinung bin, dass er aussagekräftiger sein könnte, aber es scheint, dass Entwickler der Meinung sind, dass diesinfer
nicht für die Verwendung auf diese Weise gedacht ist.Es ist wahrscheinlich nicht mehr als zwei Cent wert, aber:
Ich kann mir ein paar Gründe vorstellen, warum das
MyExperimentsUnionConstraint
funktioniert,MyExperimentsUnion
aber nicht, aber ich habe nicht die vertieften Sprachkenntnisse, um sie so auszudrücken, dass es Sinn macht.Um eine Erklärung am Beispiel zu geben:
MyExperimentsUnion
, fromTypes extends U
,U
könnte als abgeleitet werdenTypes | 'bla'
undMyExperiment<Type | 'bla'>
funktioniert dann nicht.MyExperimentsUnionConstraint
,U
kann nur als etwas zu entnehmen, dass mit WerkenMyExperiment
quelle