【发布时间】:2020-03-12 00:52:09
【问题描述】:
我尝试复制 Anders 在 Build 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>
我试图简化这一点,并提出了以下示例。条件类型在给定string 时返回number,反之亦然,而函数将此条件类型实现为返回类型。
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)
我在这里错过了什么?
【问题讨论】:
标签: typescript typescript-generics