假设我们有一个“职业”:
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;
}
}为什么前者是无效的?
发布于 2020-03-15 03:17:16
class AmericanCitizen implements Person<Profession.Teacher> {
profession = Profession.Teacher;
}由于您还没有告诉类型记录您希望profession是什么类型,类型记录将尝试从您使用它的方式推断它。它看到您将Profession.Teacher分配给它,这是枚举的一部分,因此它假设您希望profession成为该枚举。不过,这并不是枚举的具体价值,而是整件事。类似地,如果您试图定义name = "bob",它将假设您希望string作为类型,而不是特定的"bob",而age = 100将是number,而不是特定的100。
您可以通过以下几种方式告诉打字本您想要更具体的内容:
profession: Profession.Teacher = Profession.Teacher;profession = Profession.Teacher as Profession.Teacher;profession = Profession.Teacher as const;使用构造函数的版本也有效,相当于我的第一个示例。
https://stackoverflow.com/questions/60689352
复制相似问题