如何提取TypeScript类型守卫函数所校验的目标类型?
如何从类型守卫函数中提取它所守卫的类型?
你可以通过**条件类型结合类型推断(infer)**来提取类型守卫函数所守卫的目标类型,下面是具体实现方案:
问题重现
已知类型守卫函数isUser,想要提取它守卫的User类型:
type User = { username: string } function isUser(value: unknown): value is User { return value !== null && typeof value === "object" && "username" in value; } // 期望实现GuardType,让GuardType<typeof isUser>返回User类型 type GuardType<T> = ...
解决方案
实现GuardType类型,匹配类型守卫函数的返回结构并提取目标类型:
type GuardType<T> = T extends (value: unknown) => value is infer U ? U : never;
验证效果
使用上述类型后,就能得到预期的结果:
type GuardTypeOfUserGuard = GuardType<typeof isUser>; // 类型为User
原理说明
- 条件类型
T extends (value: unknown) => value is infer U用于匹配**返回类型为类型谓词(value is U)**的函数类型 infer U会自动推断出value is U中的U,也就是类型守卫的目标类型- 如果传入的
T不是符合结构的类型守卫函数,会返回never类型
扩展适配
如果你的类型守卫函数参数不是unknown(比如是any或者其他类型),可以调整条件类型的参数部分,让它更通用:
// 适配任意参数类型的类型守卫函数 type GuardType<T> = T extends (value: infer _) => value is infer U ? U : never;
内容的提问来源于stack exchange,提问作者nyarthan
相关产品推荐
相关产品推荐

