TypeScript为何无法在filter()中识别过滤后的类型?
为什么TypeScript无法识别filter已过滤掉null值?
TypeScript默认不会自动把filter的回调函数当成类型守卫。你写的过滤条件虽然能在运行时把null和空字符串筛掉,但TS的类型检查器没办法从普通的布尔返回值里,推断出这个回调到底排除了联合类型里的哪一部分。
原代码里的filter回调只返回boolean,TS只能知道过滤后的数组是原数组的子集,但没法确定剩下的元素一定是string类型,所以依然保留(string | null)[]的类型。
要让TS正确识别过滤后的类型,你需要把回调定义成类型谓词函数,明确告诉TS:当回调返回true时,当前元素的类型是string。修改后的代码如下:
const values: (string | null)[] = []; const filtered = values.filter((v): v is string => v !== null && v.trim() !== ""); // filtered 现在的类型是 string[]
类型谓词v is string相当于给TS一个明确的类型断言,让它知道通过过滤的元素肯定是string,这样就能正确推导过滤后数组的类型了。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

