Я работаю над файлом определений для API карт Google для TypeScript.
И мне нужно определить тип перечисления, например. google.maps.Animation
, который содержит два свойства: BOUNCE
и DROP
.
Как это сделать в TypeScript?
Я работаю над файлом определений для API карт Google для TypeScript.
И мне нужно определить тип перечисления, например. google.maps.Animation
, который содержит два свойства: BOUNCE
и DROP
.
Как это сделать в TypeScript?
TypeScript 0.9+ имеет спецификацию перечислений:
enum AnimationType {
BOUNCE,
DROP,
}
Конечная запятая не является обязательной.
Как и в случае с 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;
Оба этих примера сняты непосредственно из TypeScript для программистов JavaScript.
Обратите внимание, что это отличается от спецификации 0.8. Спецификация 0.8 выглядела так: но она была отмечена как экспериментальная и, вероятно, изменилась, поэтому вам придется обновить любой старый код:
Отказ от ответственности - этот пример 0.8 будет разбит на новые версии компилятора TypeScript.
enum TShirtSize {
Small: 3,
Medium: 5,
Large: 8
}
var mySize = TShirtSize.Large;
Теперь это часть языка. См. TypeScriptLang.org > Основные типы > 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();
Это будет log:
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
Оригинальный ответ:
Для значений члена String 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!