Lodash minBy非空数组时TypeScript返回类型不符问题求助
解决Lodash minBy在非空数组下返回类型包含undefined的问题
在使用Lodash的minBy函数时,当传入明确非空的数组,TypeScript仍会推断返回类型为T | undefined——这是因为TypeScript的T[]类型默认兼容空数组场景,而Lodash的类型定义需要覆盖空数组时返回undefined的情况。以下是几种可行的解决方式:
1. 非空断言操作符(简单直接)
如果你能确保数组绝对非空,可以用!操作符明确告诉TypeScript排除undefined的可能:
interface SomeType { value: number } const array: SomeType[] = [{ value: 2 }, { value: 3 }, { value: 4 }] const minValue = _.minBy(array, 'value')!; // 类型为SomeType
2. 类型收窄(安全可靠)
通过判断数组长度触发TypeScript的类型收窄,无需额外断言还能保证运行时安全:
interface SomeType { value: number } const array: SomeType[] = [{ value: 2 }, { value: 3 }, { value: 4 }] if (array.length > 0) { const minValue = _.minBy(array, 'value'); // 自动推断类型为SomeType }
3. 自定义非空数组类型
如果频繁处理非空数组,可以定义专属的非空数组类型,让minBy针对该类型返回确定的T:
type NonEmptyArray<T> = [T, ...T[]]; interface SomeType { value: number } // 标注数组为非空类型 const array: NonEmptyArray<SomeType> = [{ value: 2 }, { value: 3 }, { value: 4 }] const minValue = _.minBy(array, 'value'); // 类型为SomeType
4. 扩展Lodash类型定义
如果想全局优化minBy对非空数组的类型推断,可以扩展Lodash的类型声明:
declare module 'lodash' { interface LoDashStatic { minBy<T>(array: [T, ...T[]], iteratee: string | ((value: T) => any)): T; } }
之后所有传入非空数组(元组类型)的minBy调用,都会自动推断返回类型为T。
需要注意:前两种方法需要你确保数组不会为空,否则运行时可能出现undefined相关错误;后两种方法通过类型系统从根源约束数组非空性,更适合长期维护的项目。
内容的提问来源于stack exchange,提问作者Long Zhao
相关产品推荐
相关产品推荐

