TypeScriptのexhaustiveness checkをスマートに書く
BRANK

TypeScriptではデザインパターンとしてtagged unionによる直和がよく使われます。このときパターンマッチに相当する処理はswitchで行われますが、そこで直和に対する分岐が網羅的であることの保証を実行時と型検査時の両方で賢く行う方法がこれまでも模索されてきました。今回、ヘルパー関数を導入せずにいくつかの問題を同時に解決する賢い方法を思い付いたので共有します。 コードこれだけです。// switch (action.type) { ... default: throw new Error(`Unknown type: ${(action as { type: "__invalid__" }).type}`); // .. } 以下、より詳しく説明します。 問題TypeScriptではオブジェクトに type プロパティーを用意し、決まった文字列を入れることで直和を実現するというデザインパターンが広く使われています。このとき、パターンマッチに相当する処理はswitchで行われます。// GetまたはPutのどちらかをあらわす型 type Action = GetAction PutAction; type GetAction = { type: "Get"; name: string; }; type PutAction = { type: "Put"; name: string; value: string; }; function act(action: Action) { // Getの場合とPutの場合で場合分けする…

zenn.dev
Related Topics: TypeScript
2 comments