Effect
TypeScript生态的函数式效果系统库,通过Effect<Success, Error, Requirements>三元类型参数将错误处理纳入类型系统,提供类型化错误、依赖注入和惰性计算等能力
时间轴 (近 90 天)
Effect 类型将成功值、错误类型和依赖环境三者都编码进类型签名
Effect 在类型层面区分 Expected Errors(可预期错误,编码在 Effect<A, E, R> 的 E 参数中)和 Defects(缺陷)两类失败
Effect 常用的错误处理组合子包括 Effect.catchAll、Effect.retry 和 Effect.mapError
Effect 的 Scope 机制将资源生命周期与 Fiber 生命周期绑定,使已获取资源在 Fiber 完成、出错或中断时按逆序释放
Effect 的结构化并发设计理念来自 Kotlin 的结构化并发与 ZIO 的 Scope
Effect 的依赖注入体系由 Context、Tag 和 Layer 三个概念构成
相比 tsyringe、inversify 等基于装饰器的 DI 框架,Effect 的依赖注入完全在类型系统内运作,没有运行时元数据依赖,也不需要 TypeScript 装饰器特性
Effect V4 把大量原先分散的包合并进核心 effect 包,并附带 17 个 unstable 模块,涵盖 HTTP、RPC、CLI、workflows、clustering 等
Effect 使用 Fiber(轻量级虚拟线程)实现结构化并发
Effect 是一个 TypeScript 库,其 V4 版本处于 beta 阶段
还有 8 条时间轴事件
全部知识事实 (18)
Effect 类型将成功值、错误类型和依赖环境三者都编码进类型签名
50%待验证Effect 在类型层面区分 Expected Errors(可预期错误,编码在 Effect<A, E, R> 的 E 参数中)和 Defects(缺陷)两类失败
50%待验证Effect 常用的错误处理组合子包括 Effect.catchAll、Effect.retry 和 Effect.mapError
50%待验证Effect 的 Scope 机制将资源生命周期与 Fiber 生命周期绑定,使已获取资源在 Fiber 完成、出错或中断时按逆序释放
50%待验证Effect 的结构化并发设计理念来自 Kotlin 的结构化并发与 ZIO 的 Scope
50%待验证Effect 的依赖注入体系由 Context、Tag 和 Layer 三个概念构成
50%待验证相比 tsyringe、inversify 等基于装饰器的 DI 框架,Effect 的依赖注入完全在类型系统内运作,没有运行时元数据依赖,也不需要 TypeScript 装饰器特性
50%待验证Effect V4 把大量原先分散的包合并进核心 effect 包,并附带 17 个 unstable 模块,涵盖 HTTP、RPC、CLI、workflows、clustering 等
50%待验证Effect 使用 Fiber(轻量级虚拟线程)实现结构化并发
50%待验证Effect 是一个 TypeScript 库,其 V4 版本处于 beta 阶段
50%待验证在 Effect 错误类型中不应写入裸 Error,因为 Error 是所有错误的父类会让类型坍缩,应使用 Data.TaggedError 定义具名错误
50%待验证在 Effect 中如果不为依赖某服务的程序提供该服务,代码根本无法编译,而不是运行时出错
50%待验证Effect 的核心类型是 Effect<Success, Error, Requirements>,三个类型参数分别表示成功值、可能的错误、以及执行所需的上下文依赖
50%待验证与 Promise 只暴露 resolved 值、把错误吞进 unknown 不同,Effect 强制将错误写进类型系统
50%待验证Effect 是一个描述计算的惰性值,整个程序可被构造成一棵效果树,直到 Effect.runMain 或其他 runner 被调用时才真正执行
50%待验证Effect 的 catchTag 能精确收窄错误类型,因为每个 TaggedError 都携带字面量类型的 _tag 字段供 TypeScript 类型收窄机制识别
50%待验证Effect 提供的基础构造器包括 Effect.succeed、Effect.fail、Effect.sync、Effect.try、Effect.promise、Effect.tryPromise 和 Effect.callback
50%待验证在 Effect 的结构化并发中,若一个并行请求失败,其他请求会被立即中断,此能力是内建的
50%