类型谓词写成 (x): x is Cat,函数返回布尔的同时告诉编译器:返回真值时参数就是 Cat。它常封装自定义的判断逻辑,比如 isApiError(err) 配合 if 使用后,分支内 err 自动收窄为错误类型,访问 code 等专属属性无需断言,是替代 instanceof 的灵活手段。
与普通布尔返回不同,谓词让控制流分析跨函数生效,数组 filter 也支持:list.filter(isCat) 直接得到 Cat[]。从 TS 5.5 起还能从函数体自动推断谓词,多数场景无需手写。注意谓词声明与实现必须诚实,错误的谓词会让编译器推导出错误类型,带来更隐蔽的运行时 bug。
class Cat { meow(): void {} } class Dog { bark(): void {} } function isCat(a: Cat | Dog): a is Cat { return a instanceof Cat; } const pet = new Cat(); if (isCat(pet)) pet.meow(); // 已收窄为 Cat const list: (Cat | Dog)[] = [new Cat(), new Dog()]; const cats = list.filter(isCat); // 类型是 Cat[]