为什么TypeScript将经Boolean过滤的数组识别为string|boolean数组?
TypeScript 无法识别该表达式返回值为
string[]的原因 - 数组初始类型推导不符合预期
表达式里第一个数组项isProduction() && '/prod-path'的推导类型是string | false:当isProduction()返回假值时,该项值为布尔类型的false,返回真值时为字符串类型的/prod-path。因此整个数组的初始推导类型是(string | boolean)[],而非全字符串数组。 filter(Boolean)的默认类型定义不支持假值过滤后的类型缩窄
TypeScript 内置的Array.prototype.filter方法,只有当传入的回调是类型谓词函数(返回值为value is Type格式的函数)时,才会对返回数组的元素类型做自动缩窄。而全局Boolean构造函数的类型签名并没有被默认标记为用于假值判断的类型谓词,因此调用filter(Boolean)后,TypeScript 不会自动过滤掉原数组类型中的布尔类型可能性,返回值还是会被识别为(string | boolean)[]。
解决方案
如果需要让 TypeScript 识别返回值为string[],可以用两种常见方案处理:
- 自定义带类型谓词的真值判断函数:
function isTruthy<T>(val: T | false | null | undefined): val is T { return Boolean(val) } // 替换原有filter参数 [isProduction() && '/prod-path', 'first', 'second'].filter(isTruthy)
- 手动添加类型断言(适用于你确定过滤后所有项都是字符串的场景):
[isProduction() && '/prod-path', 'first', 'second'].filter(Boolean) as string[]
内容的提问来源于stack exchange,提问作者Thomas Johansen
相关产品推荐
相关产品推荐

