TypeScript中filter函数扩展写法为何无法使用类型谓词?
问题原因与解决办法
核心原因
TypeScript对Array.filter()的类型推断逻辑,在直接传入带类型谓词的守卫函数和用箭头函数包裹调用时,处理方式不同:
- 直接传
isFish时,TypeScript能识别这是一个返回pet is Fish类型谓词的函数,因此会自动将过滤后的数组类型缩小为Fish[]。 - 用
(p) => isFish(p)包裹后,TypeScript会默认把箭头函数的返回值推断为boolean,不会自动将内部调用的类型守卫的谓词“提升”到外层箭头函数上,所以无法缩小数组类型。
解决办法
给外层箭头函数显式声明返回值的类型谓词,让TypeScript识别这是一个类型守卫:
const underwater2: Array<Fish> = zoo.filter((p): p is Fish => isFish(p))
内容的提问来源于stack exchange,提问作者Riccardo Perego
相关产品推荐
相关产品推荐

