将枚举分配给已实现的 TypeScript 字段 Class

Assigning Enum to Field of Implemented TypeScript Class

假设我们有一个枚举,"Profession":

enum Profession {
  Teacher = "Teacher",
  Scientist = "Scientist",
  Rapper = "Rapper",
}

我们有一个 Person 接口,它接受从 Profession 的值中提取的泛型:

interface Person<P extends Profession> {
  profession: P;
}

最后,我们要实现 Person:

class AmericanCitizen implements Person<Profession.Teacher> {
  // ... problem continued below
}

...在 class 实现中,我想像这样分配通用指定的 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

为什么前者无效?

class AmericanCitizen implements Person<Profession.Teacher> {
  profession = Profession.Teacher;
}

由于您没有告诉打字稿您想要 profession 是什么类型,打字稿将尝试根据您的使用方式推断它。它看到您正在为其分配 Profession.Teacher,这是枚举的一部分,因此它假定您希望 profession 成为该枚举。虽然不是枚举的特定 value;整个东西。同样,如果您尝试定义 name = "bob",它会假定您希望将 string 作为类型,而不是特定的 "bob",而 age = 100 将是 number,而不是特定的 100 .

您可以通过多种方式告诉打字稿您想要更具体的内容:

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

你的带有构造函数的版本也可以工作,相当于我的第一个例子。