为何TypeScript中filter过滤null后数组类型仍为Date|null?
为什么TypeScript中过滤null后变量类型还是Date|null?
你写了如下TypeScript代码:先通过map生成一个包含Date|null的数组,再用filter把null过滤掉,但变量result的类型依然是(Date | null)[],而不是预期的Date[]。
代码示例:
function tester(dates:Date[], x:(_:Date)=>Date|null) { // 即便过滤掉null,result的类型仍为(Date | null)[] let result = dates.map(d => x(d)).filter(d => d !== null); }
原因
TypeScript的类型系统没办法自动识别filter(d => d !== null)这个操作会彻底移除数组里的null。默认情况下,Array.filter()的类型定义只会保留原数组的元素类型——也就是Date|null,它不会根据过滤函数的逻辑自动缩小类型范围,除非你主动给编译器提供明确的类型提示。
解决方法
有两种常用方式让TypeScript正确推断过滤后的类型:
使用类型谓词明确过滤逻辑
把过滤函数改写为带类型断言的形式,告诉编译器“通过这个函数的元素都是Date类型”:function tester(dates:Date[], x:(_:Date)=>Date|null) { let result = dates.map(d => x(d)).filter((d): d is Date => d !== null); // 此时result的类型为Date[] }强制类型转换(谨慎使用)
如果你能确保过滤后数组里绝对没有null,可以用as Date[]直接强制转换类型:function tester(dates:Date[], x:(_:Date)=>Date|null) { let result = dates.map(d => x(d)).filter(d => d !== null) as Date[]; }
内容的提问来源于stack exchange,提问作者Ross Brasseaux
相关产品推荐
相关产品推荐

