欢迎来到 Effect
Effect 是一个 TypeScript 库,提供类型化错误处理、结构化并发、资源安全与可观测性。
Effect 是一个用于构建生产级软件的 TypeScript 库:类型化错误处理、结构化并发、资源安全与可观测性,全都来自同一个可组合的核心。
为什么选择 Effect?
数据有类型,程序无类型
TypeScript 非常擅长描述你的数据,但它对你的程序几乎只字不提:一个函数的签名不会告诉你它可能出什么错、需要哪些依赖,也无法说明它能否被安全地重试、超时或中断。随着应用不断增长,团队最终只能用临时拼凑的 try/catch、缺乏结构的 Promise 以及彼此无法组合的库,手工去实现这些保障。
程序即值
Effect 用一个构建单元填补了这一空白:Effect 类型,它是一个完整描述程序的值,包括它的成功值、可能出现的错误,以及运行它所需的依赖。正因为程序是值,它们才能够组合:重试、超时、并发、资源管理和链路追踪都是你可以施加的运算符,而不是需要反复重建的架构。
开箱即用
类型化错误
失败会体现在签名中,并且可以像数据一样被处理。
重试与调度
用可组合的退避策略,取代你自己编写的循环。
结构化并发
有界的并行任务,并且会自行善后。
资源安全
资源的获取与释放都有保证,即使出现失败也不例外。
依赖注入
服务通过类型系统串联起来,在测试中替换它们轻而易举。
可观测性
运行时内置链路追踪、指标和结构化日志。
流式处理
支持背压的 Stream 与其他一切共享同一套运算符。
Schema 校验
用与现实相符的类型来解析和转换数据。
配置
从环境中读取的类型化配置,在启动时完成校验,敏感信息会被 脱敏。
一致的生态系统
HTTP、SQL、CLI、AI 和平台相关的包都构建在同一个核心之上。
为 AI 时代而生
AI 时代让这一切变得更为关键。当编码智能体编写的软件在你项目中的占比越来越大时,瓶颈就从写代码转移到了信任代码。Effect 让程序的失败模式、依赖关系和生命周期对编译器可见,把运行时的意外转化为智能体可以据以行动的精确反馈。而当你正在构建的东西本身就是 AI 应用时,不稳定的服务提供方、重试、流式传输和速率限制,正是 Effect 开箱即用地解决的问题。
你的学习路径
Effect 值得按顺序学习:每一步都建立在前一步之上。沿着这条主线走下来,大多数开发者只需专注投入几天;其余内容都从这里分叉出去。
理解核心思想
Effect 是一个描述程序的值:它产出什么、可能如何失败、运行需要 什么。其他一切都建立在这一个类型之上。
搭建你的项目
安装这个库并配置 TypeScript。Effect 只是一个依赖,无需任何 额外工具。
编写你的第一个程序
创建 Effect,用生成器把它们组合起来,并在应用的边界处运行 它们。
用 Effect 的方式处理错误
错误是有类型的值,而不是意外。了解预期失败与非预期失败、 回退方案以及重试。
进入并发世界
以有界并发并行运行 Effect,让它们相互竞速,并交给结构化并发 为你善后。
下面就是你在第一个小时内会写出的那种程序:
import { Effect } from "effect"
const program = Effect.gen(function* () {
const name = yield* Effect.succeed("world")
yield* Effect.log("Hello, " + name + "!")
})
Effect.runPromise(program)
继续前进
指南
深入详尽的文档:从管道到 PubSub 的每个主题,既可以按顺序阅读, 也可以随时按需查阅。
参考手册
每个 Effect 模块的完整 API 参考,按版本发布归档。
演练场
在浏览器中用完整的编辑器运行 Effect,无需本地环境。非常适合在 学习时作为第二个标签页打开。
加入我们的社区
Effect 社区非常活跃:核心团队和经验丰富的用户每天都在讨论,任何问题都不会被忽视。中文读者可以加入中文社区微信群直接在群里提问,官方的 GitHub 仓库 同样欢迎参与。