TypeScriptの勉強をしようとTypeScript: Handbookを見ながらいろいろ試していてハマりそうだなと思ったのでメモ。
列挙型
以下のような形式のデータ型を列挙型と呼ぶ。
enum Meta {
Hoge,
Fuga,
Foo
}
メンバーの番号付け
列挙型の値をconsole.logで出力してみると、0から始まる番号であることがわかる。
enum Meta {
Hoge,
Fuga,
Foo
}
console.log(Meta.Hoge); // 0
console.log(Meta.Fuga); // 1
console.log(Meta.Foo); // 2
この番号は手動で設定することも可能である。
enum Meta {
Hoge = 10,
Fuga = 20,
Foo = 30
}
console.log(Meta.Hoge); // 10
console.log(Meta.Fuga); // 20
console.log(Meta.Foo); // 30
途中だけ番号を付けると…?
上記の挙動を見ていながらふと思ったのでさっくり試してみた。
1つ目だけ設定する
-> 2つ目以降は1つ目のインクリメントされた値になる。
enum Meta {
Hoge = 10,
Fuga,
Foo
}
console.log(Meta.Hoge); // 10
console.log(Meta.Fuga); // 11
console.log(Meta.Foo); // 12
途中だけ設定する
-> 1つ目は0から、設定された値以降はインクリメントされた値になる。
enum Meta {
Hoge,
Fuga = 20,
Foo
}
console.log(Meta.Hoge); // 0
console.log(Meta.Fuga); // 20
console.log(Meta.Foo); // 21
最後だけ設定する
-> 1つ目は0から、最後の値は設定した値になる。
enum Meta {
Hoge,
Fuga,
Foo = 30
}
console.log(Meta.Hoge); // 0
console.log(Meta.Fuga); // 1
console.log(Meta.Foo); // 30
一部分を欠落させて設定する
-> 設定した値からインクリメントしていき、次の設定された値でインクリメントはリセットされる。
enum Meta {
Hoge = 10,
Fuga,
Foo = 30
}
console.log(Meta.Hoge); // 10
console.log(Meta.Fuga); // 11
console.log(Meta.Foo); // 30
インクリメントされうる値を手動で
以下のようにコードを記述しました。
enum Meta {
Hoge = 10,
Fuga, // 本来11になるはずだけどFooで設定済み
Foo = 11
}
さてここで問題、Meta.Fugaの値はどうなるでしょう?
答えは以下。
console.log(Meta.Hoge); // 10
console.log(Meta.Fuga); // 11
console.log(Meta.Foo); // 11
FugaとFooが一致していまいました。
そんなわけあるまいと比較した結果が以下です。
console.log(Meta.Fuga === Meta.Foo); // true
まとめ
以上により、TypeScriptを書く際は以下を気を付けたいと思います。
- 頻繁に変更が加えられるような箇所で数値の手動設定は危険
- 手動設定する場合はかなり神経質に実施する
- 可能なら手動設定がいらない方式とする