Использование значения enum в качестве интерфейса ввода в typescript

#typescript #enums #interface

#typescript #перечисления #интерфейс

Вопрос:

Допустимо ли приведенное ниже использование перечисления в интерфейсе?

 declare enum MyEnumType {
   Member1,
   Member2,
}
  
 interface Foo {
  prop1: MyEnumType,          // this is valid
  prop2: MyEnumType.Member1   // how about this? If not, why?
}
  

Ответ №1:

Если вы запустите этот код в изолированной среде, вы получите сообщение об ошибке:

 Enum type 'MyEnumType' has members with initializers that are not literals.
  

Недопустимо, только если вы declare используете enum. В этом случае вы сообщаете TS, что enum существует, но вы не сообщаете ему, каковы его значения, потому что определение этого перечисления может быть таким:

 enum MyEnumType {
  Member1 = 8,
  Member2 = 'RaNdOmWhAtEvEr'
}
  

Это означает, что MyEnumType.Member2 неоднозначно. Это сработает, если вы

  1. Определите enum явно (ключевое слово remove declare ). Теперь TypeScript полностью контролирует enum и знает, что он будет присваивать значения 0 и 1 своим ключам
  2. Явно укажите, каковы ключи объявленного перечисления
 declare enum MyEnumType {
  Member1 = 0,
  Member2 = 1
}
  

Теперь TS знает, чего ожидать от enum, и может оперировать его ключами как типами.