243 words
1 minutes
[Effect Layers] 08. 在Context.Tag内定义层
2025-08-30 18:20:15
2025-12-24 23:45:46

在Context.Tag内定义层#

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

我们看到了使用 classContext.tag 是多么方便。由于我们使用的是 class,我们能够直接在其中定义额外的方法和属性。

使用这种模式,我们将所有服务实现定义为单独的 static 参数:

export class PokeApi extends Context.Tag("PokeApi")<
  PokeApi,
  Effect.Effect.Success<typeof make>
>() {
  static readonly Live = Layer.effect(this, make).pipe(
    Layer.provide(Layer.mergeAll(PokemonCollection.Live, BuildPokeApiUrl.Live))
  );

  static readonly Mock = Layer.succeed(
    this,
    PokeApi.of({
      getPokemon: Effect.succeed({
        id: 1,
        height: 10,
        weight: 10,
        name: "my-name",
        order: 1,
      }),
    })
  );
}
TIP

层切换的便利性

为测试、模拟、开发和生产交换层变成了(少于)1行的更改:

const MainLayer = Layer.mergeAll(
  PokeApi.Mock,
);

此外,我们可以通过单次导入访问同一个 class 内的所有层、方法甚至辅助函数:

import { Effect, Layer } from "effect";
// 👇 单次导入所有层、方法和辅助函数(`Live`、`Mock` 等)
import { PokeApi } from "./PokeApi";

const MainLayer = Layer.mergeAll(
  PokeApi.Mock,
);
NOTE

Effect 中的常见模式

这种模式在Effect中很常见,也用于内部模块

[Effect Layers] 08. 在Context.Tag内定义层
https://0bipinnata0.my/posts/course/effect-beginners-complete-getting-started/layers/08-define-layers-inside-context-tag/
Author
0bipinnata0
Published at
2025-08-30 18:20:15