欢迎来到 Effect!
首先,什么是 Effect?为什么你应该关心它?
TypeScript 正在迅速成为编写商业应用程序的事实标准,无论是前端还是后端:
最新的 State of JS 调查 清楚地描绘了 JavaScript 缺失的功能:

State of Javascript 调查 2023 年结果:“你认为 JavaScript 目前缺少什么?”
我们可以说 TypeScript 解决了静态类型的问题。
那其他的呢?
标准库
更好的日期管理
不可变数据结构
管道操作符
模式匹配
错误处理
纯 TypeScript 在这些方面帮助不大。
TypeScript 生态系统的现状
许多不同的库解决了其中一些痛点。每个库都提供自己的解决方案,有自己的 API、数据结构和约定。
问题出现在当你试图将所有这些依赖项整合在一起时。你最终会编写更多代码来在多个 API 之间构建桥梁,而不是专注于你的业务逻辑。
这在同一调查中对”JavaScript 的哪些方面让你最困扰?“这个问题的回答中得到了体现:
State of Javascript 调查 2023 年结果:“JavaScript 的哪些方面让你最困扰?”
代码架构、依赖管理、性能、寻找包等问题都是每个 TypeScript 开发者的日常痛点。
简而言之,TS 没有一个强大的标准库来解决生产软件的问题。
我们最终使用了成千上万的小型 npm 包来填补空白,但它们的组合方式并不理想,使我们的代码维护起来如同噩梦。
这种情况在 2024 年 Stack Overflow 开发者调查中对”你对当前的专业开发者角色满意吗?“这个问题的回答中得到了体现:
Effect 来拯救
Effect 是 TypeScript 缺失的标准库。
如果说 TypeScript 是为了让 JavaScript 能够扩展而创建的,那么 Effect 就是为了让 TypeScript 能够扩展而创建的。
Effect 为 TypeScript 的所有主要痛点提供了原生支持:
标准库:共享相同核心 API 的包生态系统
更好的日期管理:
DateTime模块用于处理带或不带时区的日期和时间不可变数据结构:
Array、HashMap、HashSet、Trie、RedBlackTree等,全部不可变、栈安全且高性能管道操作符:使用
pipe组合程序(完全类型化)模式匹配:
Match模块用于在 TypeScript 中进行详尽的模式匹配
此外,effect 由 Effectful Technologies Inc. 维护,这是一家专注于支持和改进 Effect 的公司。
Effect 中以 MIT 许可证发布的所有内容将保持 MIT 许可证,我们不需要 CLA。
Effect 组织完全由社区管理。
Effect 提供了什么
在使用 Effect 之前,我探索了不同的包来处理模式匹配、模式验证、品牌类型、错误处理、日期格式化等功能。
这是我过去使用的包列表:
模式验证:
zod、yup、joi、io-ts模式匹配:
ts-pattern、unionize品牌类型:
newtype-ts错误处理:
ramda、purify-ts、fp-ts日期:
moment、date-fns、date-fns-tzHTTP 请求:
axios、kyCookies:
js-cookie编码:
js-base64数据结构:
lodash、underscore、immutable
不用说,维护所有这些依赖项很快就成了问题。每个库都带来了自己的类型和实用函数,经常与其他库共享相同的名称。
这导致了包大小和依赖项之间冲突的问题。
使用 effect,上述所有库都可以用仅仅 2 个包替换:
effect:Effect 核心(模式匹配、品牌类型、错误处理、日期、编码、数据结构、模式验证)@effect/platform:HTTP 请求、cookies(以及更多)
此外,由于所有这些库都建立在相同的核心类型和函数集之上,一切都是可组合的且没有冲突。
Effect 周围的社区
Effect 周围的社区正在日益壮大。
越来越多的人在尝试 Effect,分享经验和新资源。TypeScript 社区各个角落都有很多兴趣和新贡献:
那么有什么问题吗?
Effect 的主要问题是学习如何使用它。
为了充分利用 TypeScript 类型系统的全部功能,Effect 使用的模式看起来与”标准” JavaScript 代码不同。
export const main = Effect.gen(function* () {
const baseClient = yield* HttpClient.HttpClient;
const pokeApiClient = baseClient.pipe(
HttpClient.mapRequest(
flow(
HttpClientRequest.acceptJson,
HttpClientRequest.prependUrl("https://pokeapi.co/api/v2")
)
)
);
return yield* pokeApiClient.get("/pokemon/squirtle");
}).pipe(
Effect.flatMap(HttpClientResponse.schemaBodyJson(Pokemon)),
Effect.scoped,
Effect.provide(FetchHttpClient.layer)
);这通常是初学者和团队采用 Effect 的重大障碍。
💯 这正是本课程旨在解决的问题! 💯
在本课程结束时,你将能够阅读、理解并编写完整的 Effect 应用程序。
我们将从基础开始探索 Effect 的工作原理。
我们将从 Effect 的”Hello World”开始,最终构建一个完全类型安全、可测试且可维护的 Effect 应用程序。
我们将涵盖你熟练掌握 Effect 所需的一切:
Effect 代码与纯 TypeScript 的区别
使用 Effect 的好处
逐步探索最常见的 Effect API
学习如何使用 Effect 组织完全类型安全且可扩展的架构
课程按每课教授一个新概念的方式组织。这种结构允许你在学习新的 Effect API 时一步一步地进步。
做好准备,让我们开始吧!🚀