542 words
3 minutes
Effect 类型安全错误处理:1. 简单 API 请求中的复杂性

在这第一个项目中,我们将学习如何发起 API 请求

听起来很简单?等等,因为即使是一个简单的 API 请求也隐藏着很多复杂性。

我们将使用 PokeApi,这是一个返回 Pokémon 信息的开放 API。

具体来说,我们将专注于 /pokemon 端点

你可以访问这个页面查看示例响应:

{
  "id": 445,
  "order": 570,
  "name": "garchomp",
  "height": 19,
  "weight": 950
  // ...还有更多
}

Garchomp 是我最喜欢的 Pokémon 之一 🙋🏼‍♂️

发起 fetch 请求#

在纯 TypeScript 中,一个简单的 API 请求可以使用 async/await 配合 fetch+json 来实现:

index.ts

const main = async () => {
  const response = await fetch("https://pokeapi.co/api/v2/pokemon/garchomp/");
  const json = await response.json();
  return json;
};

main().then(console.log);

这有什么问题?#

上面的代码可以工作。我说的”可以工作”是指结果有可能是正确的。

显然*“有可能”*是不够的!

这不是构建真实应用程序的方式。我们希望程序总是能工作。在实践中,很多事情都可能出错:

  • API 宕机
  • 响应需要 10 分钟才能返回
  • 响应不是有效的 pokemon 数据
  • 网络连接不良
  • 身份验证无效
  • API 限制达到上限
  • API 拥塞
  • 资源缺失

你明白了。我们不能满足于可能可以工作

在所有这些情况下,当前的实现都是有问题的。应用程序会崩溃,可能会在某个地方报告一些错误。

我们说应用程序在**“快乐路径”**下工作:如果一切按预期进行,我们就能得到结果。

问题是纯 TypeScript 对所有这些问题都帮助不大

Effect 如何提供帮助?#

对于上述每个问题都有解决方案:

  • API 宕机:提供两种结果,一种是成功响应(一个 pokemon),一种是失败时的结果(错误消息)

  • 响应需要 10 分钟才能返回:设置超时,在出现错误时停止程序

  • 响应不是有效的 pokemon:报告数据问题或提供默认的 Pokémon

这就是 Effect 发挥作用的地方!我们将在接下来的课程中学习如何实现。

Effect 类型安全错误处理:1. 简单 API 请求中的复杂性
https://0bipinnata0.my/posts/course/effect-beginners-complete-getting-started/type-safe-error-handling-with-effect/complexity-in-a-simple-api-request/
Author
0bipinnata0
Published at
2025-08-30 13:00:00