Допустим, у нас есть перечисление "Профессия":
enum Profession {
Teacher = "Teacher",
Scientist = "Scientist",
Rapper = "Rapper",
}
И у нас есть интерфейс Person
, который принимает обобщенный c, извлеченный из значений Profession
:
interface Person<P extends Profession> {
profession: P;
}
И, наконец, мы хотим реализовать Person
:
class AmericanCitizen implements Person<Profession.Teacher> {
// ... problem continued below
}
... в реализации класса, я бы хотел назначить c -определенный profession
вот так:
class AmericanCitizen implements Person<Profession.Teacher> {
profession = Profession.Teacher;
}
Это приводит к следующей ошибке TS:
Property 'profession' in type 'AmericanCitizen' is not assignable to the same property in base type 'Person<Profession.Teacher>'.
Type 'Profession' is not assignable to type 'Profession.Teacher'.
Playground Link
Компилятор заставляет меня делать эквивалент длинной руки:
class AmericanCitizen implements Person<Profession.Teacher> {
profession: Profession.Teacher;
constructor() {
this.profession = Profession.Teacher;
}
}
Playground Link
Почему первое неверно?