web-dev-qa-db-ja.com

TypeScriptでenum like typeを作成するにはどうすればよいですか?

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

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

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

109
eNepper

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

enum AnimationType {
    BOUNCE,
    DROP,
}

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

130
Steve Lucco

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

enum TShirtSize {
  Small,
  Medium,
  Large
}

var mySize = TShirtSize.Large;

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

リスト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;
64
Fenton

これは現在、言語の一部です。詳細については、 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();
23
Jeroen

次のようにid/string enumを使用できることに注意してください。

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


}
14
done_merson

更新

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

以下を参照してください: TypeScriptの文字列値で列挙型を作成


元の答え:

Stringメンバー値の場合、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!
8
Arthur

TypeScriptの列挙:

列挙型はTypeScript言語に入れられ、名前付き定数のセットを定義します。列挙型を使用すると、作業が楽になります。その理由は、これらの定数は多くの場合、enumが表す値よりも読みやすいためです。

列挙型の作成:

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

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

列挙型を使用する:

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

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

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

  1. コードについて考える前に、数字をエンティティに変換する必要があります。
  2. しばらくしてコードをレビューする場合、または他のプログラマーがコードをレビューする場合、これらの数値が何を意味するのかは必ずしもわかりません。
1