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>

キーワード