TypeScriptの列挙型を詳しく説明する

TypeScriptの列挙型を詳しく説明する

序文:

TypeScript 、オリジナルの ES 型をベースに列挙型が追加され、値のグループにもTypeScript内で名前を付けられるようになりました。これにより開発者にとって使いやすくなり、列挙が辞書であることが理解しやすくなります。

列挙型は enum を使用して定義されます。

列挙型日{
  日曜日、
  月曜日、
  火曜日、
  水曜日、
  木曜日、
  金曜日、
  土曜日
 }

上記で定義した列挙型 Day には 7 つの値があります。TypeScript TypeScript 、デフォルトで 0 から始まる番号をそれぞれに割り当てます。これらを使用するときは、番号と名前の対応を覚えていなくても名前を使用できます。

列挙型日{
  日曜日 = 0、
  月曜日 = 1、
  火曜日 = 2、
  水曜日 = 3、
  木曜日 = 4、
  金曜日 = 5、
  土曜日 = 6
}

上記のコードを JavaScript に変換すると次のようになります。

var Day = void 0;
(関数 (日) {
  Day[Day["SUNDAY"] = 0] = "SUNDAY";
  日[日["月曜日"] = 1] = "月曜日";
  Day[Day["TUESDAY"] = 2] = "TUESDAY";
  Day[Day["WEDNESDAY"] = 3] = "WEDNESDAY";
  Day[Day["THURSDAY"] = 4] = "THURSDAY";
  日[日["FRIDAY"] = 5] = "FRIDAY";
  Day[Day["SATURDAY"] = 6] = "SATURDAY";
})(日 || (日 = {}));

ご覧のとおり、各値には対応する番号が割り当てられています。

TypeScript では、列挙セットのメンバーを取得するためにドット形式を使用する必要があります。

console.log(Day.SUNDAY) // 0
console.log(Day.MONDAY) // 1

列挙型の基本的な使用法について説明した後、一般的な列挙型を見てみましょう。

1. デジタル列挙

上記の例では、定数名のみを指定すると、0 から始まりデフォルトで増加する数値のセットが定義され、これをデジタル列挙と呼びます。別の値から増分を開始する場合は、最初の値のインデックスを指定できます。

列挙型カラー{
  赤 = 2、
  青、
  黄色
}
console.log(Color.Red, Color.Blue, Color.Yellow); // 2 3 4

フィールドにインデックス値を指定することができ、指定されていないインデックス値は 1 ずつ増加します。

//いくつかのフィールドを指定し、他のフィールドではデフォルトの増分インデックスを使用します enum Status {
  OK = 200、
  作成、
  承認されました、
  不正リクエスト = 400、
  許可されていない
}
console.log(Status.Created、Status.Accepted、Status.Unauthorized); // 201 202 401

さらに、各フィールドに不連続な任意のインデックス値を指定することもできます。

列挙ステータス{
  成功 = 200、
  見つかりません = 404、
  エラー = 500
}
console.log(Status.Success, Status.NotFound, Status.Error); // 200 404 500

数値列挙では、値を定義するときに計算値と定数を使用できます。ただし、フィールドで計算値または定数を使用する場合は、そのフィールドの直後のフィールドに初期値を設定する必要があります。ここではデフォルトの増分値は使用できません。例を見てみましょう。

// 初期値は計算された値です const getValue = () => {
  0を返します。
};
列挙型エラーインデックス{
  a = getValue(),
  b, // エラー列挙メンバーは初期化された値を持つ必要があります c
}
列挙型右インデックス{
  a = getValue(),
  b = 1、
  c
}
// 初期値は定数です const Start = 1;
列挙型インデックス{
  a = 開始、
  b, // エラー列挙メンバーは初期化された値を持つ必要があります c
}

2. 文字列の列挙

TypeScript 、値が文字列リテラルである列挙を文字列列挙と呼びます。文字列列挙値では、各フィールドの値が文字列リテラルまたは列挙値内の別の文字列列挙メンバーである必要があります。

// 文字列リテラル enum Message を使用 {
  エラー = 「申し訳ありません、エラーが発生しました」
  成功 = 「ほほー、成功」
}
console.log(Message.Error); // '申し訳ありません、エラーが発生しました'

// 列挙値内の他の列挙メンバーを使用する enum Message {
  エラー = "エラーメッセージ"、
  ServerError = エラー、
  ClientError = エラー
}
console.log(Message.Error); // 'エラーメッセージ'
console.log(Message.ServerError); // 'エラーメッセージ'

注:ここでの他の列挙メンバーは、同じ列挙値内の列挙メンバーを参照します。文字列列挙では定数や計算値を使用できないため、他の列挙値のメンバーは使用できません。

3. 逆マッピング

列挙型の値を定義する場合、 Enum['key']またはEnum.keyを通じて対応するvalueを取得できます。 TypeScript逆マッピングもサポートしていますが、逆マッピングでは数値列挙のみがサポートされ、文字列列挙はサポートされません。

次の例を見てみましょう。

列挙ステータス{
  成功 = 200、
  見つかりません = 404、
  エラー = 500
}
console.log(ステータス["成功"]); // 200
console.log(Status[200]); // '成功'
console.log(Status[Status["Success"]]); // '成功'

TypeScriptで定義された列挙型は、コンパイル後は実際にはオブジェクトになります。生成されたコードでは、列挙型はオブジェクトにコンパイルされ、これには順方向マッピング (名前 -> 値) と逆方向マッピング (値 -> 名前) が含まれます。

上記のコードでコンパイルされたStatusの効果を見てみましょう。

{
    200:「成功」
    404: 「見つかりません」
    500: 「エラー」、
    エラー: 500、
    見つかりません: 404,
    成功: 200
}

ご覧の通り、 TypeScript定義した列挙値のフィールド名をオブジェクトのプロパティ名とプロパティ値として使用し、列挙値のフィールド値をオブジェクトのプロパティ値とプロパティ名として使用し、同時にオブジェクトに追加します。この方法では、列挙値のフィールド名を通じて値を取得したり、列挙値の値を通じてフィールド名を取得したりできます。

4. 異種列挙

異種列挙とは、次のように、メンバー値が数値型と文字列型の両方を持つ列挙です。

列挙型結果{
  失敗 = 0、
  成功 = 「成功」
}

開発中に非同期列挙を使用することはお勧めしません。値のクラスが列挙値に編成されると、それらの特性は類似していることが多いためです。例えば、インターフェースリクエストの場合は戻りステータスコードは数値、プロンプトメッセージの場合は文字列です。そのため、列挙型を使用する場合は、主に型を整理することで、異種の列挙型の使用を回避できる場合が多くあります。

5. 定数列挙

TypeScriptでは、列挙値を定義した後、 JavaScriptにコンパイルされたコードによって、プログラムの実行時に使用できる対応するオブジェクトが作成されます。しかし、プログラムを読みやすくするためだけに列挙型を使用し、コンパイルされたオブジェクトを必要としない場合はどうなるでしょうか?これにより、コンパイルされたコードのサイズが増加します。 TypeScriptにはconst enum (定数列挙) があります。列挙を定義するステートメントの前にconstキーワードを追加します。このようにすると、コンパイルされたコードはこのオブジェクトを作成せず、置換のために列挙から対応する値を取得するだけです。

列挙ステータス{
  オフ、
  の上
}
定数列挙型動物{
  犬、
  猫
}
定数ステータス = Status.On;
定数 animal = Animal.Dog;

上記のコードは次のように JavaScript にコンパイルされます。

var ステータス;
(関数(ステータス) {
  ステータス[(Status["オフ"] = 0)] = "オフ";
  ステータス[(Status["オン"] = 1)] = "オン";
})(ステータス || (ステータス = {}));
var ステータス = Status.On;
var animal = 0; // 犬 

Statusの処理では、まず変数 Status を定義し、次に即時実行される関数を定義し、関数内のStatusに対応するプロパティを追加します。まず、 Status[“Off”] = 0Statusオブジェクトの Off プロパティを設定し、値を 0 に設定します。この代入式の戻り値は等号の右側の値である 0 であるため、 Status[Status [“Off”] = 0] = "Off"Status[0] = “Off”と同等です。このオブジェクトを作成した後、Status の On プロパティ値が status に割り当てられます。animal の処理を​​見てみましょう。コンパイルされたコードは Status のような Animal オブジェクトを作成しませんが、 Animal.Dogの値 0 をconst animal = Animal.Dog式の Animal.Dog の位置に直接置き換えます。

定数の列挙を定義することで、関連する定数のコレクションを明確で構造化された形式で維持できます。さらに、定義とインライン メンバー値は変換後に消去されるため、コード サイズとパフォーマンスは定数値を直接インライン化する場合よりも悪くなりません。

6. 列挙メンバー型と共用体列挙型

列挙値のすべてのメンバーがリテラル型の値である場合、列挙の各メンバーと列挙値自体を型として使用できます。このような列挙メンバーをリテラル列挙メンバーと呼びます。

条件を満たす列挙メンバー値には次の 3 種類があります。

  • 初期値のない列挙メンバー。例: enum E { A }
  • 値は文字列リテラルです。例: enum E { A = 'a' }
  • 値は数値リテラル、または - 記号付きの数値リテラルです。例: enum E { A = 1 }、enum E { A = -1 }

(1)列挙メンバー型

すべての列挙ケースにリテラル列挙値がある場合、列挙ケースは型になります。

列挙型動物{
  犬 = 1、
  猫 = 2
}

インターフェース Dog {
  タイプ: Animal.Dog; 
}
インターフェース Cat {
  タイプ: Animal.Cat; 
}

猫を: 猫 = {
  type: Animal.Dog // エラー [ts] 型 'Animal.Dog' は型 'Animal.Cat' に代入できません
};
犬としましょう: 犬 = {
  タイプ: 動物.犬
};

ご覧のとおり、コードの 7 行目では、型としてAnimal.Dogが使用されており、インターフェイスDogにはAnimal.Dog型の型フィールドが必要であることが指定されています。

(2)共同列挙型

列挙値が条件を満たす場合、すべてのメンバーを含む共用体型とみなすことができます。

列挙ステータス{
  オフ、
  の上
}
インターフェースライト{
  ステータス: ステータス;
}
列挙型動物{
  犬 = 1、
  猫 = 2
}
定数light1: ライト = {
  ステータス: Animal.Dog // エラー 型 'Animal.Dog' は型 'Status' に割り当てることができません
};
定数light2: ライト = {
  ステータス: ステータスオフ
};
定数light3: ライト = {
  ステータス: ステータスオン
};

上記の例では、インターフェイスLightstatusフィールドの型を列挙値Statusとして定義しています。この場合、 statusの属性値はStatus.Offまたは Status.On のいずれかでなければなりません。これは、 status: Status.Off | Status.Onと同等です。

7. 列挙のマージ

一般的な列挙型について説明した後、列挙のマージの概念を見てみましょう。列挙型の値は個別に宣言できます。

列挙型日{
  日曜日、
  月曜日、
  火曜日
 }

列挙型日{
  水曜日、
  木曜日、
  金曜日、
  土曜日
 }

このとき、 TypeScript列挙値をマージし、マージ後にJavaScriptにコンパイルされたコードは次のようになります。

var Day = void 0;
(関数 (日) {
  Day[Day["SUNDAY"] = 0] = "SUNDAY";
  日[日["月曜日"] = 1] = "月曜日";
  Day[Day["TUESDAY"] = 2] = "TUESDAY";
  Day[Day["WEDNESDAY"] = 3] = "WEDNESDAY";
  Day[Day["THURSDAY"] = 4] = "THURSDAY";
  日[日["FRIDAY"] = 5] = "FRIDAY";
  Day[Day["SATURDAY"] = 6] = "SATURDAY";
})(日 || (日 = {}));

TypeScript列挙型に関する記事はこれで終わりです。TypeScript 列挙型についてさらに詳しく知りたい方は、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続きご覧ください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • TypeScript 列挙型
  • TypeScript の基本型の紹介
  • Vue プロジェクトで TypeScript クラスを適用する方法
  • TypeScript における型保護の詳細な説明
  • TypeScriptの型保護メカニズムについての簡単な説明
  • TypeScript のクラス

<<:  Firefox で英語の文字が折り返されない問題の解決方法

>>:  Django プロジェクトを作成して MySQL に接続する方法

推薦する

Dockerfile における VOLUME と docker -v の違い

Dockerfile でのボリュームのマウントと docker -v コマンドによるマウントには明ら...

データバインディングとリストデータの表示にはVue3を使用する

目次1. Vue2との比較1. Vue3の新機能2. Vue2とVue3の応答原理の比較3. 配列の...

MySQLキーワードDistinctの詳細な紹介

MySQLキーワードDistinctの使い方の紹介DDL SQLを準備します: テーブルテストを作成...

JavaScript でタブバーの切り替え効果を実装する

フロントエンド開発者が必ず知っておくべきケースとして、タブバーの切り替え効果があります。タブバー自体...

jsネイティブウォーターフォールフロープラグイン制作

この記事では、jsネイティブウォーターフォールフロープラグインの具体的なコードを参考までに共有します...

MySQLの自動増分主キーの実装の詳細な説明

目次1. 自己増分値はどこに保存されますか? 2. 自己価値修正メカニズム3. 自動増分値を変更する...

Win7 インストール MySQL 5.6 チュートリアル図

目次1. ダウンロード2. インストール3. my.ini ファイルを設定する(デフォルトのエンコー...

Vue SPA ファースト スクリーン最適化ソリューション

目次序文最適化ソ連オンデマンドインポート1. ルーティングファイルでコンポーネントをオンデマンドでイ...

Bootstrap5 ブレークポイントとコンテナの具体的な使用法

目次1. Bootstrap5 ブレークポイント1.1 モバイルファースト1.2 ブートストラップブ...

PDO を使用して SQL インジェクションを防ぐ原理の分析

序文この記事では、SQL インジェクションを回避するために pdo の前処理メソッドを使用します。詳...

CSSは親コンテナのdivをimg画像で埋め、コンテナのサイズに適応します。

ページに複数の画像を導入すると、画像のサイズがばらつくことがあります。しかし、それらを一貫したサイズ...

CentOS サーバーのセキュリティ構成戦略

最近、ブルートフォース攻撃によるサーバのクラッキングが頻発しています。侵入行為を大まかに分析し、よく...

Linux システムに docker をインストールし、ssh 経由で docker コンテナにログインする方法

注: 私はCentosを使ってdockerをインストールしていますステップ1: Dockerをインス...

JavaScript の高度なプログラミングの基本参照型

目次1. 日付2. 正規表現3. オリジナルパッケージタイプ序文:参照値(オブジェクト)は、 Dat...

MySQL 8.0.19 winx64 インストールチュートリアルと Windows 10 での初期パスワードの変更

この記事では、参考までにMySQL 8.0.19 winx64のインストールチュートリアルを紹介しま...