Effect-TS中处理NonEmptyReadonlyArray类型问题:调用Array.max求最大值时遇类型错误
Effect-TS中处理NonEmptyReadonlyArray类型问题:调用Array.max求最大值时遇类型错误
嘿,我懂你遇到的这个问题!Effect-TS里的Array.max方法对输入的数组类型有严格要求——它只接受非空的只读数组(也就是NonEmptyReadonlyArray<number>),但你通过Array.map处理后得到的是普通的number[],TypeScript没法保证这个数组一定不是空的,所以就抛出类型错误啦。
给你两种常用的解决方案,根据你的实际场景选就行:
情况1:你能确保原数组一定非空
如果arrayOfObjects在运行时肯定不会是空数组,那可以用Array.asNonEmpty把它转换成非空数组类型,这样就能顺利调用Array.max了:
import { Array, Order, pipe } from "effect"; pipe( arrayOfObjects, Array.asNonEmpty, // 标记数组为非空类型 Array.map(o => o.value), Array.max(Order.number) );
⚠️ 注意:如果运行时数组实际是空的,Array.asNonEmpty会直接抛出错误,所以只有你100%确定数组非空时再用这个方法。
情况2:数组有可能为空
如果数组存在为空的可能性,更稳妥的做法是用Array.maxOption,它会返回一个Option<number>类型——空数组时返回None,非空时返回包裹着最大值的Some:
import { Array, Order, pipe, Option } from "effect"; const maxValueOption = pipe( arrayOfObjects, Array.map(o => o.value), Array.maxOption(Order.number) ); // 后续可以用match来处理这个Option,比如给空数组设置默认值 const finalResult = Option.match(maxValueOption, { onNone: () => 0, // 空数组时的默认值,你可以改成自己需要的 onSome: (maxNum) => maxNum });
其实这个类型约束是Effect-TS的设计亮点之一,它能帮你提前规避“空数组求最大值”这种运行时错误,毕竟空数组本身就不存在最大值嘛~
备注:内容来源于stack exchange,提问作者elango.dev
相关产品推荐
相关产品推荐

