TypeScriptでResult型を実装するときによく使う実装手法
[Safe Assignment Operator](arthurfiorette/proposal-safe-assignment-operator: Draft for ECMAScript Error Safe Assignment Operator)のプロポーザルも提案されているので、近い将来に使うことはなくなるかもしれないが、よく使っているものを残しておく。
any型, unknown型をErrorクラスに変換する
Section titled “any型, unknown型をErrorクラスに変換する”export function toError(error: unknown): Error { if (error instanceof Error) return error;
return new Error(error as never);}
通信処理をResult型で取り扱う
Section titled “通信処理をResult型で取り扱う”手抜き実装。詳細なエラーハンドリングはしていない。
import { toError } from './toError.js'
interface Failure { data: undefined; error: Error;}
interface Success<T> { data: T; error: undefined;}
type Result<T> = Success<T> | Failure;
export async function fetcher<T>(url: RequestInfo, init?: RequestInit): Promise<Result<T>> { const UNDEF = undefined;
// response: Response | Error; const response = await fetch(url, init).catch(toError); if (response instanceof Error) { return { data: UNDEF, error: response } }
if (!response.ok) { return { data: UNDEF, error: new Error("Your error message") } }
const data = await response.json(); return { data, error: UNDEF }}