Я попытался воспроизвести пример Андерса для условных типов и обобщений, которые он показал на Сборка 2018 (36:45). Он использует условный тип в качестве возвращаемого типа в качестве замены для более традиционных перегрузок функций.
Слайд имеет следующее:
type Name = { name: string };
type Id = { id: number };
type Check = { enabled: boolean };
type LabelForType<T> =
T extends string ? Name :
T extends number ? Id :
T extends boolean ? Check :
never;
declare function createLabel<T extends string | number | boolean>(value: T): LabelForType<T>
Я попытался немного упростить это и придумал следующий пример. Условный тип возвращает number
, когда ему присваивается string
, и наоборот, тогда как функция реализует этот условный тип в качестве возвращаемого типа.
type Return<T> = T extends string ? number : T extends number ? string : never;
function typeSwitch<T extends string | number>(x: T): Return<T>{
if (typeof x == "string") {
return 42;
} else if (typeof x == "number") {
return "Hello World!";
}
throw new Error("Invalid input"); // needed because TS return analysis doesn't currently factor in complete control flow analysis
}
const x = typeSwitch("qwerty"); // number
Однако оба оператора возврата показывают одинаковую ошибку:
Type '42' is not assignable to type 'Return<T>'.(2322)
Type '"Hello World!"' is not assignable to type 'Return<T>'.(2322)
Что мне здесь не хватает?