You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何提取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 00:45:00