fp-ts是否提供对象的sequence方法?泛型对象编译报错求现成实现
在fp-ts中处理异构类型对象的sequence操作
Ramda的R.sequence在处理值类型一致的对象时表现正常,比如:
const p0 = { a: O.some(1), b: O.some(2), }; const p0o = R.sequence(O.Applicative)(p0); // 类型为 O.Option<Record<string, number>>
但当对象的属性值类型不同时(比如a: number、b: string),R.sequence会将结果泛化为宽泛的对象类型,触发编译错误。
你不需要自行实现sequenceObj,fp-ts中已经内置了专门处理**结构体(struct)**的sequence工具:sequenceS,它来自fp-ts/lib/Apply模块。
使用示例
import { sequenceS } from 'fp-ts/lib/Apply'; import * as O from 'fp-ts/lib/Option'; const p1 = { a: O.some(1), b: O.some("2"), }; const p1o = sequenceS(O.Applicative)(p1); // 类型为 O.Option<{ a: number; b: string }>,完全匹配原结构体类型
为什么sequenceS能解决问题
sequenceS是针对带有明确键和对应值类型的结构体设计的,它会精确推导原对象的每个键值对类型,最终返回的Kind<F, T>中,T就是原结构体的类型,而非泛化的Record<string, ...>。
如果你的对象是标准的Record<string, A>类型(键为任意字符串,值类型统一),还可以使用fp-ts/lib/Record模块下的sequence函数:
import { sequence } from 'fp-ts/lib/Record'; import * as O from 'fp-ts/lib/Option'; const p2: Record<string, O.Option<number>> = { x: O.some(3), y: O.some(4) }; const p2o = sequence(O.Applicative)(p2); // 类型为 O.Option<Record<string, number>>
补充:元组场景
如果是处理元组而非对象,fp-ts提供了对应的sequenceT函数,同样来自Apply模块,用于保留元组的精确类型。
内容的提问来源于stack exchange,提问作者Michael Lorton
相关产品推荐
相关产品推荐

