Language
discriminated union: kind による網羅的な分岐を表す
閉じた状態集合は discriminated union と switch で表し、未知の状態を never として扱えます。
SourcepaymentMethods.ts
Node.js 22
export type Payment =
| { kind: "card"; last4: string }
| { kind: "bankTransfer"; transactionId: string };
export function describe(payment: Payment): string {
switch (payment.kind) {
case "card": return `card:${payment.last4}`;
case "bankTransfer": return `bank:${payment.transactionId}`;
}
}TestpaymentMethods.test.ts
Node.js 22
import assert from "node:assert/strict";
import test from "node:test";
import { describe } from "../../src/language/paymentMethods.js";
test("支払い方法の全kindをswitchで分岐できる", () => {
assert.equal(describe({ kind: "card", last4: "1234" }), "card:1234");
assert.equal(describe({ kind: "bankTransfer", transactionId: "tx-42" }), "bank:tx-42");
});01Assertion
このテストで確認できること
- card と bankTransfer を kind で分岐できる
- 未知の値は never による防御的な失敗に到達する
Java の sealed class に近い閉じた状態集合を union で表現できます。新しい kind を加えた時に switch の更新漏れを型検査で発見できます。
OBSERVED RESULT
expected: card → card:1234
actual: card:1234
expected: bankTransfer → bank:tx-42