用户定义的类型守卫是一个返回类型为类型谓词(x is T)的函数。当它返回 true 时,编译器会在调用代码中将参数缩小到 T — 让你能够封装自定义的运行时检查。
ts
{ (): ; }
{ (): ; }
(): pet is {
pet;
}
() {
((pet)) {
pet.();
} {
pet.();
}
}
用户定义的类型守卫是一个返回类型为类型谓词(x is T)的函数。当它返回 true 时,编译器会在调用代码中将参数缩小到 T — 让你能够封装自定义的运行时检查。
{ (): ; }
{ (): ; }
(): pet is {
pet;
}
() {
((pet)) {
pet.();
} {
pet.();
}
}
如果没有 pet is Cat 谓词,isCat 返回 boolean 会无法缩小 pet 的类型 — 编译器在 if 内仍然会看到 Cat | Dog。谓词正是教会编译器的东西。
interface User { id: number; name: string; }
function isUser(x: unknown): x is User {
return (
typeof x === "object" && x !== null &&
typeof (x as any).id === "number" &&
typeof (x as any).name === "string"
);
}
const data: unknown = await res.json();
if (isUser(data)) data.name; // ✅ safely typed as User
编译器信任你的谓词 — 如果函数体的逻辑有误,你会得到不安全的类型缩小。对于复杂的数据结构,使用 schema 验证器(如 zod)可以为你生成正确的守卫。
类型守卫让你能够将任意的运行时检查转化为可复用的缩小函数 — 对于在 API 边界验证 unknown 数据和区分联合类型成员至关重要,尤其是当简单的 typeof/in 检查本身不够用的时候。