TypeScript用のGoogleマップAPIの定義ファイルに取り組んでいます。
そして、タイプのような列挙型を定義する必要があります。 google.maps.Animation
には、BOUNCE
とDROP
の2つのプロパティが含まれます。
TypeScriptでこれをどのように行う必要がありますか?
TypeScript 0.9+には列挙型の仕様があります。
enum AnimationType {
BOUNCE,
DROP,
}
最後のコンマはオプションです。
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;
これは現在、言語の一部です。詳細については、 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();
次のように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};
}
更新:
@ 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!
列挙型は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であることに注意してください。列挙型は、基本的にマジックナンバー(特定のコンテキストでプログラマーが意味を与えているため、エンティティを表す数字)を使用できないようにします。マジックナンバーは、次の理由により不良です。