首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为实现的TypeScript类的字段分配Enum

为实现的TypeScript类的字段分配Enum
EN

Stack Overflow用户
提问于 2020-03-15 03:02:34
回答 1查看 173关注 0票数 0

假设我们有一个“职业”:

代码语言:javascript
复制
enum Profession {
  Teacher = "Teacher",
  Scientist = "Scientist",
  Rapper = "Rapper",
}

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

代码语言:javascript
复制
interface Person<P extends Profession> {
  profession: P;
}

最后,我们希望实现Person

代码语言:javascript
复制
class AmericanCitizen implements Person<Profession.Teacher> {
  // ... problem continued below
}

..。在类实现中,我想分配泛型指定的profession如下:

代码语言:javascript
复制
class AmericanCitizen implements Person<Profession.Teacher> {
  profession = Profession.Teacher;
}

这将导致以下TS错误:

代码语言:javascript
复制
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'.

操场连接

编译器强迫我执行长手等效的操作:

代码语言:javascript
复制
class AmericanCitizen implements Person<Profession.Teacher> {
  profession: Profession.Teacher;

  constructor() {
    this.profession = Profession.Teacher;
  }
}

操场连接

为什么前者是无效的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-15 03:17:16

代码语言:javascript
复制
class AmericanCitizen implements Person<Profession.Teacher> {
  profession = Profession.Teacher;
}

由于您还没有告诉类型记录您希望profession是什么类型,类型记录将尝试从您使用它的方式推断它。它看到您将Profession.Teacher分配给它,这是枚举的一部分,因此它假设您希望profession成为该枚举。不过,这并不是枚举的具体价值,而是整件事。类似地,如果您试图定义name = "bob",它将假设您希望string作为类型,而不是特定的"bob",而age = 100将是number,而不是特定的100。

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

代码语言:javascript
复制
profession: Profession.Teacher = Profession.Teacher;
代码语言:javascript
复制
profession = Profession.Teacher as Profession.Teacher;
代码语言:javascript
复制
profession = Profession.Teacher as const;

使用构造函数的版本也有效,相当于我的第一个示例。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60689352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档