为何Lodash的_.sample函数在两种场景下返回类型不同?
为什么Lodash的_.sample在两种TypeScript场景下返回类型不同?
核心原因是TypeScript对数组的类型推断逻辑存在差异:
示例1:直接传入字面量数组
当你直接将[1, 2, 3]作为参数传给_.sample时,TypeScript会把这个字面量推断为只读元组类型readonly [1, 2, 3]。这个类型明确表示数组固定包含3个元素,不可能是空数组。Lodash的类型定义针对非空元组场景,会直接返回元组内元素的类型(此处为number),不会包含undefined。示例2:赋值给变量后传入
当你把[1, 2, 3]赋值给const arr时,TypeScript默认会将arr推断为普通数组类型number[]。这种类型的数组允许后续被修改(比如通过arr.length = 0清空),TypeScript无法保证调用_.sample时数组一定非空。而_.sample在传入空数组时会返回undefined,因此类型推断结果为number | undefined。
如果想让示例2的返回类型也为number,可以手动将数组指定为只读元组:
const arr = [1, 2, 3] as const; const myNumber = _.sample(arr); // 此时myNumber的类型为1 | 2 | 3,可通过类型缩小统一为number
内容的提问来源于stack exchange,提问作者Alfred
相关产品推荐
相关产品推荐

