1322 words
7 minutes
Effect 入门教程:1. 为什么学习 Effect
2025-08-27 23:13:01
2025-12-24 23:45:46

原文 https://www.typeonce.dev/course/effect-beginners-complete-getting-started/setting-up-the-project/why-learning-effect#the-state-of-the-typescript-ecosystem

欢迎来到 Effect

首先,什么是 Effect?为什么你应该关心它?

TypeScript 正在迅速成为编写商业应用程序的事实标准,无论是前端还是后端:

最新的 State of JS 调查 清楚地描绘了 JavaScript 缺失的功能:

missing-features-javascript-state-of-js

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 模块用于处理带或不带时区的日期和时间

  • 不可变数据结构ArrayHashMapHashSetTrieRedBlackTree 等,全部不可变、栈安全且高性能

  • 管道操作符:使用 pipe 组合程序(完全类型化)

  • 模式匹配Match 模块用于在 TypeScript 中进行详尽的模式匹配

  • 错误处理:像 OptionEitherCause 等模块来处理预期和意外的错误

此外,effectEffectful Technologies Inc. 维护,这是一家专注于支持和改进 Effect 的公司。

Effect 中以 MIT 许可证发布的所有内容将保持 MIT 许可证,我们不需要 CLA。

Effect 组织完全由社区管理

Effect 提供了什么#

在使用 Effect 之前,我探索了不同的包来处理模式匹配、模式验证、品牌类型、错误处理、日期格式化等功能。

这是我过去使用的包列表:

  • 模式验证:zodyupjoiio-ts

  • 模式匹配:ts-patternunionize

  • 品牌类型:newtype-ts

  • 错误处理:ramdapurify-tsfp-ts

  • 日期:momentdate-fnsdate-fns-tz

  • HTTP 请求:axiosky

  • Cookies:js-cookie

  • 编码:js-base64

  • 数据结构:lodashunderscoreimmutable

不用说,维护所有这些依赖项很快就成了问题。每个库都带来了自己的类型和实用函数,经常与其他库共享相同的名称。

这导致了包大小和依赖项之间冲突的问题。

使用 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 时一步一步地进步。

做好准备,让我们开始吧!🚀

Effect 入门教程:1. 为什么学习 Effect
https://0bipinnata0.my/posts/course/effect-beginners-complete-getting-started/setting-up-the-project/why-learning-effect/
Author
0bipinnata0
Published at
2025-08-27 23:13:01