コンテンツにスキップ

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クラスに変換する”
toError.ts
export function toError(error: unknown): Error {
if (error instanceof Error) return error;
return new Error(error as never);
}

手抜き実装。詳細なエラーハンドリングはしていない。

fetcher.ts
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
}
}