为何‘value is Type’类型守卫的ReturnType为boolean?能否跨函数传递?
问题解答
首先明确:{value} is {Type} 形式的类型守卫在单个函数里完全生效,比如你写的checkType本身就是一个有效的类型守卫,当直接用它做条件判断时,TypeScript会正确收窄变量类型:
const str: string = 'a'; if (checkType(str)) { // 这里str的类型会被收窄为'a' console.log(str.toUpperCase()); }
但你的getType返回类型被推断为boolean的原因是:TypeScript不会自动把调用类型守卫函数的结果,推断为外层函数的类型守卫返回值——类型守卫的特殊返回类型无法通过函数调用自动传递,必须给外层函数显式标注类型守卫返回类型。
解决方法很简单,手动给getType加上返回类型标注:
const checkType = (string: string): string is 'a' => string === 'a'; // 显式标注返回类型为 value is 'a' const getType = (value: 'a' | 'b'): value is 'a' => checkType(value); // 现在 getType 的类型是:(value: "a" | "b") => value is "a"
这样当你调用getType做条件判断时,TypeScript就能正确收窄value的类型了:
const val: 'a' | 'b' = 'a'; if (getType(val)) { // val 类型被收窄为 'a' } else { // val 类型被收窄为 'b' }
总结一下:
- 单个函数内的类型守卫正常生效;
- 函数间传递类型守卫能力,需要外层函数显式声明类型守卫返回类型,不能依赖TypeScript自动推断。
内容的提问来源于stack exchange,提问作者Sue Kim
相关产品推荐
相关产品推荐

