|> Weeeeeeb

どんどんドーナツどーんと行こう!(10万円山さん)

Typescriptでmapのkeyに対して型定義を行う

最近はTypescriptで開発する所が専らな気がします。 私も例にもれずTypescriptでReact.jsを書いています。

今回は限られたkeyしか認めないmapオブジェクトを生成するときの処理に詰まったので それを備忘録として残しておきます。

    interface Auth = "google.com" | "facebook.com";
    interface Props {
        id: Auth;
        text: string;
    }

    const map: { [key in Auth]: Props } = {
      "google.com": {
              id: "google.com" as Auth,
              text: "Google",
            },
      "facebook.com": {
              id: "facebook.com" as Auth,
              text: "Facebook",
            },
    };

上記にコードを実際に載せましたが、大事なのは map変数の定義箇所です。

const map: { [key in Auth]: Props }

これはkeyをAuth型、valueがProps型のmapという定義になります。 valueの定義は特に問題ないと思います。

keyの型の定義だけが特殊で [key in Auth] となっています。 これは [key: Auth] と書くんじゃないかという方が多く見られると思います。 (私もそう思っていました)

でもこれはTypescriptからエラーが出力されるため気をつけるようにしましょう

エラー内容

An index signature parameter type cannot be a union type. 
Consider using a mapped object type instead.

なぜこの書き方になるのか。 という部分についてですが、調査が足りず分かっていません。 解決方法で申し訳ございませんが、もしお分かりな方はコメント等でご教授いただけますと幸いです。