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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 22:48:22