🐢
Effectの外の世界からEffectを使う
これは何?
- Effect-TSの学習記録です
-
Effectで表現できる世界の事象を、関数から呼び出すサンプルとなります - 記事のタイトル的に意味深ですが、完全にアウトプット目的なので有益なユースケースを提供することは目的にしません
環境
- Effect 3.15.4
- TypeScript 5.5.2
やること
Effectで作成した処理関数を、TypeScriptの非同期関数から呼び出す。
Webアプリケーションで、Effectを使うときのためのシミュレートである。
コード
準備
まずは、認可データの取得関数を定義。これを次にEffectでラップする。
// 型定義
interface User {
readonly name: string;
}
type NullableUser = Promise<User | null>;
type AuthFunc = () => NullableUser;
// 認可データの取得をシミュレートする関数
const auth1: AuthFunc = () => Promise.resolve({ name: "taro1" });
const auth2: AuthFunc = () => Promise.resolve({ name: "taro2" });
const notAuth: AuthFunc = () => Promise.resolve(null);
Effectで処理をラップ
上で定義した認可データ取得関数をEffectから呼び出す。
認可データがnullであるとき、例外を定義するが、スローはしない。
今回は学習のため、例外も成功も保持して後続で標準出力したいので、Effect.partitionを使う。
import { Effect, pipe } from "effect";
// 認可データから名前フィールドを取得するEffect
const fetchAuthUserName = (authFunc: AuthFunc) =>
pipe(
Effect.promise(() => authFunc()),
Effect.filterOrFail(
// 認可データがnullであればErrorとして処理する
(user): user is User => user != null,
() => new Error("unauthorized")
),
Effect.andThen((user) => user.name)
);
// 成功データと失敗データを両方保持するEffect。後続で表示するため
const partitionAuth = Effect.partition([auth1, auth2, notAuth], (auth) =>
fetchAuthUserName(auth)
);
非同期関数でEffectを実行
非同期関数でEffectを実行する。
// Effectの外の世界から、Effectを実行する
async function fetchUserFromEffect() {
// Effectの実行
const results = await Effect.runPromise(partitionAuth);
console.log(`
############################################
error results from effect : ${results[0]}
success results from effect : ${results[1]}
############################################
`);
}
await fetchUserFromEffect();
実行結果:
############################################
error results from effect : Error: unauthorized
success results from effect : taro1,taro2
############################################
成功データも失敗データも、標準出力に出せることが確認できる。
new Error("unauthorized") した例外は、スローするのではなくEffectで処理することで、try-catchの実行を抑制している。
まとめ
Effectを非同期関数から利用した。
エラーハンドリングをtry-catchに依存しなくて良くなったのはメリットに思える。しかし果たして、これがEffectの良さなのか、正しい使い方なのか、まだ判別できるほど学習が進んでおらずもどかしい。
Effectの良さが分かるまで引き続き学習を続ける。
以上。
Discussion