如何在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
相关产品推荐
相关产品推荐

