TypeScript实现GuardType提取类型守卫的目标类型
实现类型守卫目标类型提取工具
问题场景
现有如下类型守卫函数:
function isFish(pet: Fish | Bird): pet is Fish { return (pet as Fish).swim !== undefined; }
需要实现通用类型工具GuardType<T>,支持通过typeof 类型守卫函数提取守卫对应的目标类型,即满足:
type ExtractedFishType = GuardType<typeof isFish>; // ExtractedFishType 等价于 Fish 类型
工具实现
利用TypeScript条件类型+infer类型推断,匹配类型守卫的返回值谓词结构即可实现:
type GuardType<T> = T extends (...args: any[]) => any is infer R ? R : never;
实现原理
- 类型守卫的核心特征是返回值为
参数名 is 目标类型的类型谓词结构 - 条件类型中用
...args: any[]匹配任意入参的函数,不限制参数个数和类型 - 用
infer R占位捕获类型谓词中is关键字后的目标类型 - 若传入的泛型T不是合法的类型守卫函数,兜底返回
never类型,可根据业务需求调整兜底值
验证示例
// 测试类型定义 interface Fish { swim: () => void; } interface Bird { fly: () => void; } function isFish(pet: Fish | Bird): pet is Fish { return (pet as Fish).swim !== undefined; } // 提取类型 type ExtractedFishType = GuardType<typeof isFish>; // 类型校验:ExtractedFishType 完全等价于 Fish const fish: ExtractedFishType = { swim: () => {} }; // 正常通过类型校验
内容的提问来源于stack exchange,提问作者johann1301s
相关产品推荐
相关产品推荐

