这是一个尽量小、可直接运行的 Effect v4 release candidate 示例项目。示例只依赖核心包 effect@rc,所有代码集中在 src/index.ts,并配有中文注释,适合按区块阅读和改动。
当前安装到的 RC 版本由
effect@rc决定。Effect v4 要求 TypeScript 5.9+、Node.js 18+,并要求开启严格类型检查。
npm install
npm run dev # 执行所有演示
npm run check # 只做类型检查
npm run build # 编译到 dist/Effect.succeed、map、flatMap:Effect 是惰性的可组合计算。Data.TaggedError、catchTag:把业务失败放进类型通道。Schema.Struct、decodeUnknownEffect:在unknown边界完成运行时校验和类型收窄。Context.Service、Layer、Effect.provide:业务代码声明依赖,入口提供实现。Effect.all、race、forkChild、Fiber.join:并发和结构化 Fiber 生命周期。Schedule.recurs、retry、timeout:可组合的重试策略和超时中断。acquireRelease、scoped:资源成功、失败、中断时都能清理。Stream:惰性、逐项的数据流处理。Ref:并发安全的原子状态更新。Effect.logInfo、日志注解、Metric.counter:最小可观测性示例。
Effect<A, E, R>:
A:成功值(Success)。E:可恢复的业务错误(Error)。never表示不会失败。R:运行时需要的服务(Requirements)。never表示不依赖外部服务。
例如:
Effect.Effect<User, RepositoryError | Schema.SchemaError, UserRepository>表示这个程序成功返回 User,可能失败为两种错误,并要求 UserRepository 服务。
- 把
servicesDemo中的用户 ID 从1改成0,观察RepositoryError的恢复分支。 - 把
schemaDemo的输入字段改错,观察 Schema 的错误消息。 - 把并发任务的延迟改大,观察
race的胜者和all的结果顺序。 - 让
flaky在第 6 次才成功,观察Schedule.recurs(5)的边界。 - 在资源 demo 中让使用阶段失败,确认 release 仍然执行。
- 给 Stream 增加
Stream.mapEffect或Stream.runForEach,练习逐项异步处理。