Error Handling
Result: TypeScriptには checked exception がない
回復可能な失敗を型で示したい場合、戻り値を discriminated union にします。
SourceportParsing.ts
Node.js 22
export type Result<T> = { ok: true; value: T } | { ok: false; error: string };
export function parsePort(text: string): Result<number> {
const port = Number(text);
if (!Number.isInteger(port) || port < 1 || port > 65_535) {
return { ok: false, error: "invalid port" };
}
return { ok: true, value: port };
}TestportParsing.test.ts
Node.js 22
import assert from "node:assert/strict";
import test from "node:test";
import { parsePort } from "../../src/result/portParsing.js";
test("不正なポートはResultのerrorを返す", () => {
assert.deepEqual(parsePort("8080"), { ok: true, value: 8080 });
assert.deepEqual(parsePort("abc"), { ok: false, error: "invalid port" });
});01Assertion
このテストで確認できること
- 有効な値は ok の結果として返す
- 不正な値は error の結果として返す
TypeScript の throw は関数シグネチャに現れません。呼び出し側へ処理を求める失敗には Result 型を選ぶ判断があります。
OBSERVED RESULT
expected: parsePort("abc") → { ok: false, error: "invalid port" }
actual: error result