Как создать перечислимый тип в TypeScript?
Я работаю над файлом определений для API Карт Google для TypeScript.
и мне нужно определить перечисление, как тип, например. google.maps.Animation
, который содержит два свойства: BOUNCE
и DROP
.
как это должно быть сделано в TypeScript?
5 ответов:
TypeScript 0.9+ имеет спецификацию для перечислений:
enum AnimationType { BOUNCE, DROP, }
последняя запятая необязательна.
начиная с TypeScript 0.9 (в настоящее время альфа-релиз) вы можете использовать определение enum следующим образом:
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;
оба этих примера подняты непосредственно из TypeScript для JavaScript Программисты.
обратите внимание, что это различные спецификации 0.8. спецификация 0.8 выглядела так - но она была отмечена как экспериментальная и, вероятно, изменится, поэтому вам придется обновить любой старый код:
отказ от ответственности - этот пример 0.8 будет нарушен в более новых версиях компилятора TypeScript.
enum TShirtSize { Small: 3, Medium: 5, Large: 8 } var mySize = TShirtSize.Large;
теперь это часть языка. См.TypeScriptLang.org > основные типы > перечисление для документации по этому вопросу. Выдержка из документации о том, как использовать эти перечисления:
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 со следующим:
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
оригинальный ответ:
для значений строковых элементов TypeScript разрешает только числа в качестве значений перечисления. Но есть несколько решений / хаков, которые вы можете реализовать;
Решение 1:
скопировать от кого: https://blog.rsuter.com/how-to-implement-an-enum-with-string-values-in-typescript/
есть простое решение: просто приведите строковый литерал к любому перед назначением:
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';
здесь мы имеем создал переменную foo, которая позволяет присвоить ей только литеральное значение "Hello". Это показано ниже:
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!