已发布 上游基线 bf46254 原文 ↗ 在 GitHub 编辑

欢迎来到 Effect

Effect 是一个用于构建生产级软件的 TypeScript 库——类型化错误处理、结构化并发、资源安全与可观测性,全都来自同一个可组合的核心。

Effect 是一个用于构建生产级软件的 TypeScript 库:类型化错误处理、结构化并发、资源安全与可观测性,全都来自同一个可组合的核心。

为什么选择 Effect?

数据有类型,程序无类型

TypeScript 非常擅长描述你的数据,但它对你的程序几乎只字不提:一个函数的签名不会告诉你它可能出什么错、需要哪些依赖,也无法说明它能否被安全地重试、超时或中断。随着应用不断增长,团队最终只能用临时拼凑的 try/catch、缺乏结构的 Promise 以及彼此无法组合的库,手工去实现这些保障。

程序即值

Effect 用一个构建单元填补了这一空白:Effect 类型,它是一个完整描述程序的值,包括它的成功值、可能出现的错误,以及运行它所需的依赖。正因为程序是值,它们才能够组合:重试、超时、并发、资源管理和链路追踪都是你可以施加的运算符,而不是需要反复重建的架构。

开箱即用

类型化错误

失败会体现在签名中,并且可以像数据一样被处理。

重试与调度

用可组合的退避策略,取代你自己编写的循环。

结构化并发

有界的并行任务,并且会自行善后。

资源安全

资源的获取与释放都有保证,即使出现失败也不例外。

依赖注入

服务通过类型系统串联起来,在测试中替换它们轻而易举。

可观测性

运行时内置链路追踪、指标和结构化日志。

流式处理

支持背压的 Stream 与其他一切共享同一套运算符。

Schema 校验

用与现实相符的类型来解析和转换数据。

配置

从环境中读取的类型化配置,在启动时完成校验,敏感信息会被 脱敏。

一致的生态系统

HTTP、SQL、CLI、AI 和平台相关的包都构建在同一个核心之上。

为 AI 时代而生

AI 时代让这一切变得更为关键。当编码智能体编写的软件在你项目中的占比越来越大时,瓶颈就从写代码转移到了信任代码。Effect 让程序的失败模式、依赖关系和生命周期对编译器可见,把运行时的意外转化为智能体可以据以行动的精确反馈。而当你正在构建的东西本身就是 AI 应用时,不稳定的服务提供方、重试、流式传输和速率限制,正是 Effect 开箱即用地解决的问题。

你的学习路径

Effect 值得按顺序学习:每一步都建立在前一步之上。沿着这条主线走下来,大多数开发者只需专注投入几天;其余内容都从这里分叉出去。

  1. 理解核心思想

    Effect 是一个描述程序的值:它产出什么、可能如何失败、运行需要 什么。其他一切都建立在这一个类型之上。

  2. 搭建你的项目

    安装这个库并配置 TypeScript。Effect 只是一个依赖,无需任何 额外工具。

  3. 编写你的第一个程序

    创建 Effect,用生成器把它们组合起来,并在应用的边界处运行 它们。

  4. 用 Effect 的方式处理错误

    错误是有类型的值,而不是意外。了解预期失败与非预期失败、 回退方案以及重试。

  5. 进入并发世界

    以有界并发并行运行 Effect,让它们相互竞速,并交给结构化并发 为你善后。

下面就是你在第一个小时内会写出的那种程序:

import { Effect } from "effect"

const program = Effect.gen(function* () {
  const name = yield* Effect.succeed("world")
  yield* Effect.log("Hello, " + name + "!")
})

Effect.runPromise(program)

继续前进

加入我们的社区

Effect 社区非常活跃:核心团队和经验丰富的用户每天都在那里,任何问题都不会被忽视。中文读者可以加入中文社区微信群直接提问,也可以在官方的 GitHub 仓库 上参与讨论。