TL;DR
- Effect では、関数ごとのエラーを区別するため、識別子の
_tagプロパティを持つカスタムエラーを定義することを推奨している。 - エラーの異なる関数を合成すると、エラー型はユニオン型として集約される。
内容
カスタムエラーの定義
Effect では、関数の間でエラーを区別するために、独自のカスタムエラーを定義することを推奨している。カスタムエラーは、エラーの識別子となる _tag プロパティを持つ必要がある。
interface FetchError {
readonly _tag: "FetchError"
}ただし、この書き方そのものが推奨されているわけではない。実際には Data.TaggedError を使ったほうがよい。
Effect.tryPromise での利用
カスタムエラーを使うには、Effect.tryPromise に try と catch を持つオブジェクトを渡す。catch で、失敗したときに返すエラーを指定する。
const fetchRequest = Effect.tryPromise({
try: () => fetch("https://pokeapi.co/api/v2/pokemon/garchomp"),
catch: (): FetchError => ({ _tag: "FetchError" }),
})
const jsonResponse = (response: Response) =>
Effect.tryPromise({
try: () => response.json(),
catch: (): JsonError => ({ _tag: "JsonError" }),
})エラー型の集約
異なるエラーを持つ関数を Effect.flatMap などで合成すると、すべてのエラー型がユニオン型として Effect.Effect の型に集約される。
const main = fetchRequest.pipe(Effect.flatMap(jsonResponse))
// ^ const main: Effect.Effect<any, FetchError | JsonError, never>