TypeScript строгая проверка перечисления - PullRequest
0 голосов
/ 18 октября 2018

Есть ли способ обеспечить строгое использование enum?Некоторые примеры:

enum AnimalType {
  Cat,
  Dog,
  Lion
}

// Example 1
function doSomethingWithAnimal(animal: AnimalType) {
  switch (animal) {
    case Animal.Cat: // ...
    case Animal.Dog: // ...
    case 99: // This should be a type error
  }
}

// Example 2
someAnimal.animalType = AnimalType.Cat; // This should be fine
someAnimal.animalType = 1; // This should be a type error
someAnimal.animalType = 15; // This should be a type error

По сути, если я скажу, что что-то имеет тип enum, то я хочу, чтобы компилятор TypeScript (или, альтернативно, tslint) удостоверился, что он используется правильно.С текущим поведением я не очень понимаю смысл перечислений, поскольку они не применяются.Чего мне не хватает?

1 Ответ

0 голосов
/ 18 октября 2018

Это намеренное решение проекта со стороны команды TypeScript, чтобы включить битовые флаги, см. эту проблему для получения дополнительной информации.Читая эту проблему и различные, на которые она ссылается, я чувствую, что они хотят, чтобы они изначально разделяли перечисления и битовые флаги, но не могут добраться до места внесения критических изменений / добавления флага.

Работает так, как вам нужно, с строкой enum вместо числовой:

enum AnimalType {
  Cat = "Cat",
  Dog = "Dog",
  Lion = "Lion"
}

// Example 1
function doSomethingWithAnimal(animal: AnimalType) {
  switch (animal) {
    case AnimalType.Cat: // Works
    case AnimalType.Dog: // Works
    case "99": // Error: Type '"99"' is not assignable to type 'AnimalType'. 
  }
}

// Example 2
const someAnimal: { animalType: AnimalType } = {
  animalType: AnimalType.Dog
};
let str: string = "foo";
someAnimal.animalType = AnimalType.Cat; // Works
someAnimal.animalType = "1"; // Type '"1"' is not assignable to type 'AnimalType'.
someAnimal.animalType = str; // Error: Type 'string' is not assignable to type 'AnimalType'.

Live Example на игровой площадке

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...