【TS】Enum / Union / const assertion

■ はじめに

TypeScript で、 Enum を使いたかったが
どうも使わない方がいいらしい。
で、その代わりに、Union型 / const assertionを使おうっ
て話があるので、調べてみた。

実行環境
https://www.typescriptlang.org/play

目次

【1】Enum - 列挙型
 1)サンプル
 2)Enum を使わない方がいい理由
【2】Union - 合併型
 1)サンプル
【3】const assertion
 1)サンプル

【1】Enum - 列挙型

* 他の言語にもあるお馴染みのEnum
 => 関連する値を纏めるもの
* C言語の Enum とはほぼ同じイメージ

1)サンプル

enum UserType {
  None = '',
  Admin = 'Admin',
  User = 'User',
};

2)Enum を使わない方がいい理由

以下に記載されている。
 => 個人的には、Enumの方が扱いやすいし可読性が高いと思うが
  参考文献にあるように「世の流れにのって union 型に切り替えて」
  って流れになるんだろうなーって思う。

https://www.kabuku.co.jp/developers/good-bye-typescript-enum
https://engineering.linecorp.com/ja/blog/typescript-enum-tree-shaking/
https://qiita.com/saba_can00/items/696baa5337eb10c37342

参考文献

https://typescript-jp.gitbook.io/deep-dive/type-system/enums

【2】Union - 合併型

* 複数の型/値を定義できる
 => 「id: string | number」だと、id は 文字列と数値どちらも扱える
* C言語の Union とは全く違う

1)サンプル

// Union で 3種類定義
type UserType = "None" | "Admin" | "User";

const userType: UserType = "Admin";

console.log(userType);

参考文献

https://typescript-jp.gitbook.io/deep-dive/type-system/discriminated-unions

【3】const assertion

* TypeScript3.4から導入された機能
* オブジェクト・配列に対して readonly を付与してくれる

1)サンプル

const UserType = {
  None: '',
  Admin: 'Admin',
  User: 'User'
} as const;
type UserType = typeof UserType[keyof typeof UserType];

const userType1: UserType = 'Admin';
console.log(userType1);

// Loopも可能
for (const userType2 of Object.values(UserType)) {
  console.log(userType2);
}

参考文献

https://www.cyokodog.net/blog/typescript-enum-replacement/
https://moyapro.com/2019/04/11/typescript-union-vs-enum/

関連記事

TypeScript ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2020/12/21/180904
TypeScript ~ 型エイリアス (Type Alias) ~
https://dk521123.hatenablog.com/entry/2022/04/02/000000
JavaScript ~ 列挙型 ~
https://dk521123.hatenablog.com/entry/2015/12/11/093900