Присвоение Enum полю реализованного класса TypeScript - PullRequest
0 голосов
/ 15 марта 2020

Допустим, у нас есть перечисление "Профессия":

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

Почему первое неверно?

1 Ответ

1 голос
/ 15 марта 2020
class AmericanCitizen implements Person<Profession.Teacher> {
  profession = Profession.Teacher;
}

Поскольку вы не указали машинописи, какой тип вы хотите profession, машинопись попытается вывести его из того, как вы его используете. Он видит, что вы присваиваете ему Profession.Teacher, который является частью перечисления, поэтому предполагается, что вы хотите, чтобы profession было этим перечислением. Хотя не указывается c значение перечисления; Все это. Точно так же, если вы попытаетесь определить name = "bob", это будет означать, что вы хотите string в качестве типа, а не конкретно "bob", и age = 100 будет number, а не конкретно 100.

Вы можете сказать, наберите, что вы хотите что-то более конкретное c несколькими способами:

profession: Profession.Teacher = Profession.Teacher;
profession = Profession.Teacher as Profession.Teacher;
profession = Profession.Teacher as const;

Ваша версия с конструктором тоже работает и эквивалентна моему первому примеру.

...