TypeScript 4.7 führte explizite Varianz-Annotationen 'in' und 'out' für generische Typparameter ein. 'out T' markiert eine kovariante Position (der Typ erscheint nur in Ausgaben), 'in T' kennzeichnet Kontravarianz (nur Eingaben), und 'in out' erzwingt Invarianz. Diese Annotationen werden vom Compiler validiert: Wenn du einen Parameter mit 'out' markierst, ihn aber in einer Eingabeposition verwendest, meldet TypeScript einen Fehler. Über die Dokumentation hinaus beschleunigen sie Assignability-Checks, weil der Compiler die Varianz-Berechnung kurzschließen kann. Verwende sie bei Interfaces, deren generischer Parameter eine feste Rollenrichtung hat, um die Subtyping-Intention explizit zu machen.
interface Producer<out T> {produce(): T;}interface Consumer<in T> {consume(value: T): void;}declare const animalProducer: Producer<{ name: string }>;// Covariant: a Producer<NarrowerOutput> flows into Producer<WiderOutput>const detailedProducer: Producer<{ name: string; age?: number }> = animalProducer;declare const stringConsumer: Consumer<string>;// Contravariant: a Consumer<WiderInput> flows into Consumer<NarrowerInput>const literalConsumer: Consumer<"hello"> = stringConsumer;