💡

TypeScript で Go の多値返却エラーハンドリングっぽく使える Result 型を考えた

2022/08/29に公開

初投稿です。

作った Result 型

次のような型エイリアスで表現する。

type Result<T, E> = [T, undefined] | [undefined, E];

説明

Go 言語では、次のような多値返却を利用したエラーハンドリングがよく行われる。

res, err := somefunc();
if err != nil {
	// エラーハンドリング
} else {
	// `res` を使う
}

TypeScript で冒頭の Result 型を用いると

// 正常時の値を `int` で、エラーを `string` で返す関数
function somefunc(success: boolean): Result<int, string> {
    if (success) {
        return [42, undefined];      // 正常
    } else {
        return [undefined, "error"]; // エラー
    }
}

const [res, err] = somefunc(true);
if (err !== undefined) {
    // エラーハンドリング
    // `err` の型は `string` に確定される
} else {
    // `res` を使う
    // 嬉しいことに、 `res` の型は `int` に確定される
}

として、型推論をうまく効かせながら Go 言語っぽく書けそう。

Discussion