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

如何在TypeScript中提取类型守卫函数的被守卫类型?

TypeScript中如何提取类型守卫函数的目标类型?

你可以通过自定义条件类型来提取类型守卫函数所断言的目标类型,具体实现如下:

先看你的类型守卫函数:

function isSomething(object: object): object is { id: string; } {
  return 'id' in object;
}

要提取其中的{ id: string; }类型,我们可以定义一个专门的条件类型来匹配类型守卫函数的返回结构:

type GuardedType<T extends (...args: any[]) => any> = 
  T extends (...args: any[]) => args[0] is infer U 
    ? U 
    : never;

使用这个类型就能得到你想要的结果:

type HasId = GuardedType<typeof isSomething>; // { id: string; }

原理说明

这个条件类型的逻辑很直接:

  • 首先约束泛型T为任意函数类型
  • 检查该函数的返回类型是否为类型谓词(即args[0] is U的形式,这里args[0]指向函数的第一个参数)
  • 如果匹配成功,就通过infer关键字提取出被断言的类型U;如果传入的不是类型守卫函数,则返回never

如果你的类型守卫函数是针对其他参数的断言(比如第二个参数),只需要调整args的索引即可,例如:

// 针对第二个参数的类型守卫
function isSecondArgValid(_: any, arg: unknown): arg is { name: string } {
  return typeof arg === 'object' && arg !== null && 'name' in arg;
}

// 提取第二个参数的守卫类型
type GuardedTypeForSecondArg<T extends (...args: any[]) => any> = 
  T extends (...args: any[]) => args[1] is infer U 
    ? U 
    : never;

type HasName = GuardedTypeForSecondArg<typeof isSecondArgValid>; // { name: string }

内容的提问来源于stack exchange,提问作者Tomáš Hübelbauer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 10:45:33