TypeScriptでタイプのような列挙型を作成するにはどうすればよいですか?


120

TypeScript用のGoogle Maps APIの定義ファイルに取り組んでいます。

そして、私はタイプのような列挙型を定義する必要があります。google.maps.AnimationこれにはBOUNCE、およびの2つのプロパティが含まれますDROP

TypeScriptでこれをどのように行う必要がありますか?


3
Googleマップv3の定義が完成し、GithubおよびNuGet
eNepperに

回答:


140

TypeScript 0.9+には列挙型の仕様があります。

enum AnimationType {
    BOUNCE,
    DROP,
}

最後のコンマはオプションです。


11
enumTypeScriptチームが変更することを明確に示しているため、この段階では構成を使用しないことをお勧めします。
Fenton、2012年

1
回答に追加するコードなど、編集ツールに慣れてください。回答を変えましたので、ご覧ください。また、その言語機能に関して関連するディスカッションがある場合は、参照を残してください。
hakre

enum Animation {BOUNCE = 1、DROP}、それはMaps APIがそれらを定義する方法だからです。
dchest


列挙型とそのメンバーの命名規則は、c#と同じです。(どちらもMicrosoftから)。PascalCaseです。UPPER_CASEではありません。
ドミニク

66

TypeScript 0.9(現在はアルファリリース)以降では、次のような列挙型定義を使用できます。

enum TShirtSize {
  Small,
  Medium,
  Large
}

var mySize = TShirtSize.Large;

デフォルトでは、これらの列挙にはそれぞれ0、1、2が割り当てられます。これらの数値を明示的に設定したい場合は、列挙型宣言の一部として設定できます。

リスト6.2明示的なメンバーを持つ列挙

enum TShirtSize {
  Small = 3,
  Medium = 5,
  Large = 8
}

var mySize = TShirtSize.Large;

これらの例はどちらも、JavaScriptプログラマー向けTypeScriptから直接持ち上がりました。

これは0.8仕様とは異なることに注意してください。0.8の仕様は次のようになりましたが、実験的であり、変更される可能性が高いため、古いコードを更新する必要があります。

免責事項 -この0.8の例は、TypeScriptコンパイラの新しいバージョンでは機能しません。

enum TShirtSize {
  Small: 3,
  Medium: 5,
  Large: 8
}

var mySize = TShirtSize.Large;

3
これは現在RCで機能しているため、TSの将来のバージョンで機能しなくなる可能性があるため、これは受け入れられる答えになるはずです。
エイドリアングリゴー14

24

これは現在言語の一部です。このドキュメントについては、TypeScriptLang.org> Basic Types> enumを参照してください。これらの列挙型の使用方法に関するドキュメントからの抜粋:

enum Color {Red, Green, Blue};
var c: Color = Color.Green;

または手動バッキング番号を使用して:

enum Color {Red = 1, Green = 2, Blue = 4};
var c: Color = Color.Green;

たとえば、を使用して列挙名に戻ることもできColor[2]ます。

これがすべて一緒に行われる方法の例を次に示します。

module myModule {
    export enum Color {Red, Green, Blue};

    export class MyClass {
        myColor: Color;

        constructor() {
            console.log(this.myColor);
            this.myColor = Color.Blue;
            console.log(this.myColor);
            console.log(Color[this.myColor]);
        }
    }
}

var foo = new myModule.MyClass();

これはログに記録します:

undefined  
2  
Blue

これを書いている時点で、Typescript Playgroundは次のコードを生成するためです。

var myModule;
(function (myModule) {
    (function (Color) {
        Color[Color["Red"] = 0] = "Red";
        Color[Color["Green"] = 1] = "Green";
        Color[Color["Blue"] = 2] = "Blue";
    })(myModule.Color || (myModule.Color = {}));
    var Color = myModule.Color;
    ;
    var MyClass = (function () {
        function MyClass() {
            console.log(this.myColor);
            this.myColor = Color.Blue;
            console.log(this.myColor);
            console.log(Color[this.myColor]);
        }
        return MyClass;
    })();
    myModule.MyClass = MyClass;
})(myModule || (myModule = {}));
var foo = new myModule.MyClass();

14

次のものを使用してid / string列挙型を作成できることに注意してください。

class EnumyObjects{
    public static BOUNCE={str:"Bounce",id:1};
    public static DROP={str:"Drop",id:2};
    public static FALL={str:"Fall",id:3};


}

2
どのようにそれらにアクセスし、strそれidを使用しますか?
kba 2013年

1
EnumyObjects.BOUNCE.strは値にアクセスします。
done_merson 2013年

2
このデザインの問題は、オブジェクトがすべて変更可能であり、問​​題を引き起こす可能性があることです:goo.gl/CT4Ip
Fenton

abstract classTypeScriptにはstatic class?の概念がないので、インスタンス化を防ぐ方が適切でしょう。
jocull 2015年

10

更新

@ iX3で述べたように、Typescript 2.4は列挙型文字列をサポートしています。

参照:Typescriptで文字列値を持つ列挙型を作成する


元の答え:

文字列メンバー値の場合、TypeScriptは数値を列挙型メンバー値としてのみ許可します。ただし、実装できるソリューション/ハックはいくつかあります。

解決策1:

コピー元:https : //blog.rsuter.com/how-to-implement-an-enum-with-string-values-in-typescript/

簡単な解決策があります:割り当てる前に文字列リテラルをanyにキャストしてください:

export enum Language {
    English = <any>"English",
    German = <any>"German",
    French = <any>"French",
    Italian = <any>"Italian"
}

ソリューション2:

コピー元:https : //basarat.gitbooks.io/typescript/content/docs/types/literal-types.html

タイプとして文字列リテラルを使用できます。例えば:

let foo: 'Hello';

ここでは、リテラル値「Hello」の割り当てのみを許可するfooという変数を作成しました。これを以下に示します。

let foo: 'Hello';
foo = 'Bar'; // Error: "Bar" is not assignable to type "Hello"

これらはそれ自体ではあまり有用ではありませんが、型共用体で組み合わせて強力な(そして有用な)抽象化を作成できます。例:

type CardinalDirection =
    "North"
    | "East"
    | "South"
    | "West";

function move(distance: number, direction: CardinalDirection) {
    // ...
}

move(1,"North"); // Okay
move(1,"Nurth"); // Error!

1
TypeScript 2.4は、列挙型の文字列リテラル型をサポートしています。stackoverflow.com/questions/15490560/…およびblogs.msdn.microsoft.com/typescript/2017/06/27/…を
iX3

1

typescriptの列挙:

列挙型はtypescript言語に入れられ、一連の名前付き定数を定義します。列挙型を使用すると、私たちの生活が簡単になります。この理由は、これらの定数は、列挙型が表す値よりも読みやすいことが多いためです。

列挙型の作成:

enum Direction {
    Up = 1,
    Down,
    Left,
    Right,
}

typescript docsからのこの例は、列挙型がどのように機能するかを非常にうまく説明しています。最初の列挙値(Up)が1で初期化されていることに注意してください。次に、enumの以下のすべてのメンバーがこの値から自動的にインクリメントされます(つまり、Down = 2、Left = 3、Right = 4)。最初の値を1で初期化しなかった場合、列挙型は0から始まり、自動インクリメントします(つまり、下= 1、左= 2、右= 3)。

列挙型の使用:

次の方法で列挙型の値にアクセスできます。

Direction.Up;     // first the enum name, then the dot operator followed by the enum value
Direction.Down;

この方法では、コードの記述方法がはるかにわかりやすくなっています。列挙型は基本的に、マジックナンバー(特定のコンテキストでプログラマーが意味を与えたためにエンティティを表す数字)を使用できないようにします。マジックナンバーは、次の理由により不適切です。

  1. 考え抜く必要があります。コードについて推論する前に、まず数値をエンティティに変換する必要があります。
  2. しばらくしてコードをレビューする場合、または他のプログラマーがコードをレビューする場合、彼らは必ずしもこれらの数値の意味を理解しているとは限りません。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.