TypeScript为何无法识别数组filter(Boolean)后的非空返回类型?
TypeScript中
filter(Boolean)后类型仍包含null的原因 先看这段代码:
const data = [ { id: '1' }, { id: null }, { id: '2' }, { id: null }, { id: '3' }, ]; const result: string[] = data.map(({ id }) => id).filter(Boolean); ^^^^^^ // Type '(string | null)[]' is not assignable to type 'string[]'
明明filter(Boolean)已经把所有null都过滤掉了,为什么TypeScript还是认为结果是(string | null)[],没法直接赋值给string[]?
原因很直接:TypeScript的类型系统没法自动识别filter(Boolean)这种通用过滤逻辑的精准类型收缩。
Boolean在这里只是一个普通函数,它的返回类型是boolean。TypeScript只知道你用这个函数过滤掉了返回false的元素,但它没办法关联到“返回false的元素就是null”这个具体逻辑。- TS对
filter的默认类型推断规则是:只要传入的过滤函数返回boolean,就只会保留原数组元素的联合类型,不会主动排除其中的假值类型。它不会去分析过滤函数内部到底筛掉了什么,只会基于函数签名做推断。
所以哪怕我们明确知道结果里没有null,TS也没法自动推断出来,这时候就需要手动用类型断言,或者自定义类型谓词函数来帮TS明确过滤后的类型。
内容的提问来源于stack exchange,提问作者Mike K
相关产品推荐
相关产品推荐

