370 words
2 minutes
[Effect Layers] 01. 定义更多服务
2025-08-30 18:20:08
2025-12-24 23:45:46

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

在复杂应用中组织依赖关系时,仅仅使用服务已经不够了。我们很快就会遇到相互依赖的问题,以及如何提供相互依赖的服务的问题。

IMPORTANT

Layer 抽象的必要性

Effect为此提供了一个更好的抽象:Layer

让我们看看为什么需要这个。

添加更多服务#

我们需要一些更复杂的东西来理解 Layer 的意义。

那么让我们添加一些服务。

TIP

服务的灵活性

在Effect中,服务不需要是方法的集合。任何东西都可以用 Context 包装来创建服务。

例如,我们可以创建一个包含非空 string 列表的 PokemonCollection 服务:

PokemonCollection.ts

import { Context, type Array } from "effect";

export class PokemonCollection extends Context.Tag("PokemonCollection")<
  PokemonCollection,
  /// 👇 你最喜欢的宝可梦名称列表
  Array.NonEmptyArray<string>
>() {}

我们使用Effect的 Array 模块中的 Array.NonEmptyArray。这要求 PokemonCollection 列表中至少有1个宝可梦

Array 超出了本课程的范围。它非常有用,我建议你在文档中探索它!

服务也可以是单个函数。我们可以创建一个 BuildPokeApiUrl 服务,用于构建请求宝可梦的PokéApi URL端点:

BuildPokeApiUrl.ts

import { Context } from "effect";

export class BuildPokeApiUrl extends Context.Tag("BuildPokeApiUrl")<
  BuildPokeApiUrl,
  /// 👇 单个函数
  (props: { name: string }) => string
>() {}

那么单个 string 的服务呢?我们也可以这样做:

PokeApiUrl.ts

import { Context } from "effect";

export class PokeApiUrl extends Context.Tag("PokeApiUrl")<
  PokeApiUrl,
  // 👇 甚至单个 `string` 也可以
  string
>() {}
[Effect Layers] 01. 定义更多服务
https://0bipinnata0.my/posts/course/effect-beginners-complete-getting-started/layers/01-defining-more-services/
Author
0bipinnata0
Published at
2025-08-30 18:20:08