如何在Typescript中实现基于kind的类型推断与switch分支完备性校验
TypeScript 严格类型匹配实现方案
以下是同时满足你两个需求的可运行实现,基于最新稳定版 TypeScript 即可支持:
type KindA = {kind:'a'}; type KindB = {kind:'b'}; type KindC = {kind:'c'}; type AllKinds = KindA | KindB | KindC; // 泛型绑定输入kind类型与返回值类型 function create<T extends AllKinds['kind']>(kind: T): Extract<AllKinds, { kind: T }> { switch(kind) { case "a": return {kind:'a'}; case "b": return {kind:'b'}; case "c": return {kind:'c'}; // 穷尽性检查,缺失分支时直接编译报错 default: const _exhaustiveCheck: never = kind; throw new Error(`未知类型: ${_exhaustiveCheck}`); } } // 调用时自动推断返回值类型:输入"a"返回值类型自动为KindA const res = create("a");
需求匹配说明
- 满足switch缺失分支提示:如果后续新增
KindD类型扩展了AllKinds,但没有在switch中添加对应case,default处的_exhaustiveCheck赋值会直接触发编译错误,提醒你补全分支。 - 满足输入输出类型绑定:泛型
T直接关联输入参数kind的字面量类型,通过Extract工具类型从联合类型AllKinds中匹配对应的返回类型,无需使用as T这类不安全的类型断言,每个case的返回值都会被严格校验,比如case "a"返回{kind:'b'}会直接触发编译报错。
内容的提问来源于stack exchange,提问作者Yoz
相关产品推荐
相关产品推荐

