Typescript使用Array.filter()时如何正确推导非空返回值类型
你遇到的是TypeScript默认不会为Array.filter的普通回调做类型缩小的问题,以下是几个不需要额外定义新类型的可行方案:
方案1:给filter回调添加显式类型谓词
这是最安全的写法,TypeScript会基于类型谓词自动缩小过滤后的数组元素类型,不需要额外类型断言:
const gpsLocationList = allHouses // 类型谓词显式声明过滤后元素的类型:House类型且location属性必存在 .filter((house): house is House & { location: GPSLocation } => house.location !== undefined) .map(house => house.location) // 此时TS自动推导类型:const gpsLocationList: GPSLocation[]
方案2:用flatMap替代filter+map组合
写法更简洁,不需要额外写类型声明,TypeScript可自动推导正确类型:
// 存在location则返回包含该值的单元素数组,不存在返回空数组,flatMap自动压平结果 const gpsLocationList = allHouses.flatMap(house => house.location ? [house.location] : []) // 此时TS自动推导类型:const gpsLocationList: GPSLocation[]
方案3:类型断言(不推荐)
如果你确定过滤逻辑不会出错,也可以在map阶段直接断言类型,写法最简单但丢失了类型校验能力:
const gpsLocationList = allHouses .filter(house => house.location !== undefined) .map(house => house.location as GPSLocation)
内容的提问来源于stack exchange,提问作者extraxt
相关产品推荐
相关产品推荐

