#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
неоднозначно. Это сработает, если вы
- Определите enum явно (ключевое слово remove
declare
). Теперь TypeScript полностью контролирует enum и знает, что он будет присваивать значения0
и1
своим ключам - Явно укажите, каковы ключи объявленного перечисления
declare enum MyEnumType {
Member1 = 0,
Member2 = 1
}
Теперь TS знает, чего ожидать от enum, и может оперировать его ключами как типами.