0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

TypeScriptの列挙型の値

0
Posted at

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を書く際は以下を気を付けたいと思います。

  • 頻繁に変更が加えられるような箇所で数値の手動設定は危険
    • 手動設定する場合はかなり神経質に実施する
    • 可能なら手動設定がいらない方式とする
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?