// *** before: ***
function createLogger<T>(defaultLevel: T, levels: T[]): T {
return defaultLevel;
}
// T выводится и из defaultLevel, и из levels - лишний элемент в levels
// незаметно расширяет T на весь список
createLogger("info", ["info", "debug", "typo"]); // T расширился, ошибки нет
// *** in version 5.4: ***
function createLoggerChecked<T>(defaultLevel: T, levels: NoInfer<T>[]): T {
return defaultLevel;
}
createLoggerChecked("info", ["info", "debug", "typo"]);
// <-Error: T выводится только из defaultLevel ("info"),
// "typo" не входит в T = "info"