假设我们有一个枚举,“专业”:
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'.
编译器强迫我做长期等效:
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;
您的带有构造函数的版本也适用,并且等效于我的第一个示例。