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

问题描述 投票:0回答:1

假设我们有一个枚举,“专业”:

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
}

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

为什么前者无效?

typescript enums constructor implements incompatibility
1个回答
0
投票
class AmericanCitizen implements Person<Profession.Teacher> {
  profession = Profession.Teacher;
}

由于您尚未告诉打字稿您想要profession的类型,打字稿将尝试从您的使用方式中推断出它。它看到您正在为其分配Profession.Teacher,这是枚举的一部分,因此假定您希望profession是该枚举。虽然不是枚举的特定value;整个东西。类似地,如果您尝试定义name = "bob",它将假设您希望string作为类型,而不是“ bob”,并且age = 100number,而不是100。

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

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

您的带有构造函数的版本也适用,并且等效于我的第一个示例。

© www.soinside.com 2019 - 2024. All rights reserved.