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

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