Effect 有一个免费 TypeScript 库 — TS 缺失的标准库
发布: (2026年3月28日 GMT+8 14:35)
4 分钟阅读
原文: Dev.to
Source: Dev.to
问题:TypeScript 没有标准库
Python 附带了 os、json、datetime、collections、itertools 等模块。
Go 提供了 net/http、encoding/json、fmt 等包。
而 TypeScript 则依赖 npm 生态系统:
- 想要重试?安装一个包。
- 想要模式验证?再装一个包。
- 想要完善的错误处理?再装一个包。
- 想要并发控制?再装一个包。
Effect:一个全面的 TypeScript 库
Effect 是一个免费的 TypeScript 库,为语言带来了缺失的标准库。它可以处理:
- 错误(具备完整的类型安全)
- 并发与并行
- 重试和退避策略
- 流式处理
- 依赖注入
- 以及更多…
错误成为类型的一部分
// 在普通的 TypeScript 中,错误是不可见的。
async function getUser(id: string): Promise {
const res = await fetch(`/api/users/${id}`) // NetworkError?
const data = await res.json() // ParseError?
return UserSchema.parse(data) // ValidationError?
}// 使用 Effect,错误是类型签名的一部分。
import { Effect } from 'effect'
const getUser = (id: string): Effect.Effect => { /* implementation */ }TypeScript 强制你处理错误
const result = getUser('123').pipe(
Effect.catchTag('NetworkError', () => fallbackUser),
Effect.catchTag('ParseError', () => Effect.fail(new AppError()))
)示例
带指数退避的重试
import { Effect, Schedule } from 'effect'
const fetchWithRetry = fetchData.pipe(
Effect.retry(
Schedule.exponential('1 second').pipe(
Schedule.compose(Schedule.recurs(3))
)
)
)
// 重试 3 次,采用指数退避。类型安全。无需额外库。带并发限制的并行处理
const results = Effect.forEach(
items,
(item) => processItem(item),
{ concurrency: 10 }
)通过 Context 和 Layer 实现依赖注入
import { Context, Effect, Layer } from 'effect'
class Database extends Context.Tag('Database') Effect.Effect } // (original snippet)
// 你的代码声明它需要什么
const getUsers = Database.pipe(
Effect.flatMap(db => db.query('SELECT * FROM users'))
)
// 测试提供一个 mock
const testLayer = Layer.succeed(Database, {
query: () => Effect.succeed([{ id: 1, name: 'Test' }])
})
// 生产环境提供真实实现
const prodLayer = Layer.succeed(Database, {
query: (sql) => pgPool.query(sql)
})典型使用场景
- 具有多种失败模式的复杂业务逻辑
- 需要重试、超时和并发控制的数据管道
- 需要结构化错误处理的后端服务
- 希望减少运行时意外的团队
- 简单的 CRUD 应用
- 前端组件和 UI 逻辑
- 脚本和一次性任务
- 对函数式编程概念尚不熟悉的团队
安装
npm install effect联系方式
如果你需要定制方案或有任何疑问,欢迎随时联系:
构建数据管道?在 Apify 上已有超过 88 个生产爬虫为你处理重试、速率限制和反爬措施。