

（ちょっとタイトルがわかりにくいのはわかっています。表現が難しいのでもう少し練ります）

String Literalで定義されている`Status`に対応する値を定義するために、`statusMap`というものを以下のように定義します。

[code]

    export type Status = "SOME_TEXT" | "HELLO" | "GOOD" | "RANDOM";
    
    type ValueObject = {
        text: string;
    };
    
    const statusMap: Record<Status, ValueObject | undefined> = {
        "SOME_TEXT": {
            text: "status 1",
        },
        "HELLO": {
            text: "status 2",
        },
        "GOOD": undefined,
        "RANDOM": undefined,
        // どんどん増える
    };
    
[/code]

このとき、`Status`に新しい状態が増えると`statusMap`が型エラーとなり、その時の振る舞いを実装者が決めるように促すことができます。

しかしながら、例にあるように`SOME_TEXT`と`HELLO`は値が決まっているが、それ **以外**
の値が`undefined`で決まっている場合に、`Status`の種類が増えるたびに実装させるのは冗長になっていきます。例えば数1000も状態があるとそれをすべて実装することになるのは面倒。

そこで、if/switchなどを利用し、することで"SOME_TEXT"と"HELLO"以外のすべてを`undefined`にすることはできます。  
ただしこれは新しい`Status`が追加されたときにすべて`undefined`の状態になるだけで、本当に必要な変更を見逃す可能性があります。

[code]

    const getStatusValue = (status: Status): ValueObject | undefined => {
      switch (status) {
        case "SOME_TEXT": {
          return {
            text: "status 1",
          };
        }
        case "HELLO": {
          return {
            text: "status 2",
          };
        }
        default: {
          return undefined;
        }
      }
    };
    
[/code]

今求めているのは、

  * 新規の`Status`が定義されたときに、値が定義されていないことを型エラーで検知したい
  * 既存の状態が`undefined`の部分は値の定義をスキップしたい。

です。このような型定義の方法はありますか？


CC BY-SA 4.0
2023-02-01T06:07:07.867
93654
2023-02-01T06:07:07.867
7997
question
typescript
TypeScriptのObjectで状態定義を型安全にしつつ、必要のない状態は定義を簡略化したい