280 words
1 minutes
[Effect Services] 03. 使用服务
2025-08-30 17:48:33
2025-12-24 23:45:46

使用服务#

https://github.com/typeonce-dev/effect-getting-started-course

让我们回到我们的入口文件 index.ts

我们的新 program 将使用 PokeApi 服务并调用 getPokemon

TIP

服务使用基础

由于服务是从 Context 创建的,它可以在 Effect.gen 内部像普通的 Effect 一样处理。我们可以通过简单地yield 服务本身来提取服务 API:

index.ts

import { Effect } from "effect";
import { PokeApi } from "./PokeApi";

const program = Effect.gen(function* () {
  const pokeApi = yield* PokeApi;
});

pokeApi 包含我们在 PokeApi 接口内定义的所有方法。

https://vmfiooakcvcmnormoutn.supabase.co/storage/v1/object/public/sandromaglione-com/blog-images/context-service-methods-autocomplete

同样,无需手动检查服务中有哪些可用方法。IDE 为我们完成了所有工作。

我们现在可以调用 getPokemon

index.ts

const program = Effect.gen(function* () {
  const pokeApi = yield* PokeApi;
  return yield* pokeApi.getPokemon;
});
WARNING

常见错误:忘记 yield*

记住 getPokemon 是一个 Effect,因此我们需要使用 yield* 来执行它。

这是一个常见错误,请注意这一点!

如果你忘记了 yield*,你会看到最终的 Effect 类型包含另一个 Effect。这是因为需要 yield* 来解包 getPokemon effect:

https://vmfiooakcvcmnormoutn.supabase.co/storage/v1/object/public/sandromaglione-com/blog-images/effect-issue-missing-yield-type

如果你注意到 Effect 包装在 Effect 内部,那可能是因为你在某处忘记了 yield*

[Effect Services] 03. 使用服务
https://0bipinnata0.my/posts/course/effect-beginners-complete-getting-started/effect-services/03-using-a-service/
Author
0bipinnata0
Published at
2025-08-30 17:48:33