将枚举分配给已实现的 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'.
编译器强制我执行等效的长手操作:
class AmericanCitizen implements Person<Profession.Teacher> {
profession: Profession.Teacher;
constructor() {
this.profession = Profession.Teacher;
}
}
为什么前者无效?
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;
你的带有构造函数的版本也可以工作,相当于我的第一个例子。
假设我们有一个枚举,"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'.
编译器强制我执行等效的长手操作:
class AmericanCitizen implements Person<Profession.Teacher> {
profession: Profession.Teacher;
constructor() {
this.profession = Profession.Teacher;
}
}
为什么前者无效?
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;
你的带有构造函数的版本也可以工作,相当于我的第一个例子。