310 words
2 minutes
[Effect Schema] 03. 从Schema解码数据

从Schema解码数据#

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

第一步是定义我们期望从响应中得到的 Schema。完成 ✅

现在我们需要使用 Schema 来验证响应(unknown)是否为有效的 Pokemon

我们通过使用 Schema.decodeUnknown 和我们自定义的 Pokemon Schema 来实现这一点:

import { Schema } from "effect"; const Pokemon = Schema.Struct({ id: Schema.Number, order: Schema.Number, name: Schema.String, height: Schema.Number, weight: Schema.Number, }); const decodePokemon = Schema.decodeUnknown(Pokemon);

生成的 decodePokemon 函数接受任何 unknown 值并返回 Effect<Pokemon, ParseError>

  • Pokemon:解码成功时的有效对象

  • ParseError:解码过程中出错的信息

然后我们可以将其添加到我们的 program 中:

const program = Effect.gen(function* () { const response = yield* fetchRequest; if (!response.ok) { return yield* new FetchError(); } const json = yield* jsonResponse(response); return yield* decodePokemon(json); });

记住要在 decodePokemon 前添加 yield*,因为 Schema 验证是一个可能失败的副作用操作!

由于我们引入了新的 ParseError,我们需要处理它:

const main = program.pipe( Effect.catchTags({ FetchError: () => Effect.succeed("Fetch error"), JsonError: () => Effect.succeed("Json error"), ParseError: () => Effect.succeed("Parse error"), }) );

看到这有多么简单了吗?你在 program 上工作,然后检查其类型以查看可能出错的地方,并处理所需的一切。

当你的应用开始在复杂性上扩展时,你会更加欣赏这一点。

[Effect Schema] 03. 从Schema解码数据
https://0bipinnata0.my/posts/course/effect-beginners-complete-getting-started/effect-schema/03-decoding-data-from-a-schema/
Author
0bipinnata0
Published at
2025-08-30 17:04:40