はじめに

JavaScript や TypeScript でオブジェクト (辞書・連想配列) を使う際、キーに変数や定数の値を使いたい場面はよくあります。しかし、他の言語と同じ感覚で書くと期待通りに動かないことがあり、初めて遭遇するとハマりやすいポイントです。

この記事では、辞書のキーに定数や変数を使う方法と、その仕組みについて解説します。

辞書に定数を用いた時の挙動

JavaScript で辞書を使っていた時、キーに定数や変数を使いたい場面はよくあると思います。
しかし、以下のように辞書のキー部分に定数を使うと定数名がそのままキーになってしまい、定義した文字列で値を取り出すことができません。

const KEY_TEST = "test";
const dictionary = {
    KEY_TEST: "辞書の値"
};
console.log(dictionary[KEY_TEST]);    // undefined
console.log(dictionary["KEY_TEST"]);  // 辞書の値

辞書に定数を使う方法

辞書のキーとして定数を渡すときに、以下のように定数を角括弧 ( [] ) で囲むと、内部の値を参照するようになります。
角括弧が必要なのは、JavaScript の言語仕様としてオブジェクトリテラルのキーに文字列を使用する際 "" で囲まなくてもよく、そのままでは変数・定数なのか文字列なのか判断がつかないためです。

const KEY_TEST = "test";
const dictionary = {
    [KEY_TEST]: "辞書の値"
};
console.log(dictionary[KEY_TEST]);  // 辞書の値
console.log(dictionary["test"]);    // 辞書の値

実践的な使い方

この構文は TypeScript の enum をキーとしてオブジェクトを定義する場合に特に便利です。以下のように enum のメンバーをキーとして使うことで、型安全かつ可読性の高いコードが書けます。

enum SampleEnum {
    one,
    two,
    three,
}

const sample_dict = {
    [SampleEnum.one]: 1,
    [SampleEnum.two]: 2,
    [SampleEnum.three]: 3,
};

まとめ

JavaScript のオブジェクトリテラルでキーに変数や定数の値を使いたい場合は、角括弧 [] で囲む必要があります。この構文は Computed Property Names と呼ばれ、ES2015 以降で使用可能です。他の言語から JavaScript に入門した方がつまずきやすいポイントなので、ぜひ覚えておいてください。