【问题标题】:Property Doesn't Exist on Typescript InterfaceTypescript 接口上不存在属性
【发布时间】:2016-02-09 17:29:34
【问题描述】:

我有一个自定义的“枚举”接口,它有一个值和一个描述。我已经像这样定义了我的枚举接口-

module App {
  export interface IMyEnum {
    [index: string]: IMyEnumValue;
  }

  export interface IMyEnumValue {
      value: any;
      text: string;
  }
}

我的枚举是这样的-

/// <reference path="./enums.interface.ts"/>

module App {
  export const StatusEnum: IMyEnum = {
    Normal: { value: 100, text: 'Normal' },
    Overdue: { value: 200, text: 'Overdue' },
    Critical: { value: 300, text: 'Critical' }
  }
}

但是打字稿编译器抱怨 IMyEnum 类型上不存在“Normal”。

let statusCode = StatusEnum.Normal.value;

在不定义IStatusEnum 接口的情况下是否可以这样做?我认为这会过度设计。

【问题讨论】:

  • 尝试将Normal 放入"Normal"

标签: javascript interface typescript


【解决方案1】:

当您将StatusEnum 转换为IMyEnum 时,您实际上会丢失类型信息,只剩下一个索引器:[index: string]: IMyEnumValue

选项 1:使用字符串

let statusCode = StatusEnum["Normal"].value;

您将失去枚举名称的编译时安全性(例如,StatusEnum["normal"].value 将给出运行时错误)。

选项2:去掉IMyEnum,让编译器推断类型。

  export const StatusEnum = {
    Normal: { value: 100, text: 'Normal' },
    Overdue: { value: 200, text: 'Overdue' },
    Critical: { value: 300, text: 'Critical' }
  }

let statusCode = StatusEnum.Normal.value;

这样您将获得类型安全和自动完成功能。

【讨论】:

  • 猜猜我不能吃蛋糕也不能吃。谢谢!
  • 实际上,第二个选项在类型安全方面相当不错。你声明IMyEnum的主要原因是什么?
  • 试图为我采用的一些旧代码添加一些意义。我希望通过编译器让每个对象都受相同规则的约束,而不是按照惯例松散地遵守它们。但这已经足够了。
猜你喜欢
  • 1970-01-01
  • 2019-07-22
  • 1970-01-01
  • 2019-04-25
  • 2018-10-13
  • 2023-04-02
  • 2018-08-17
  • 1970-01-01
  • 2023-02-06
相关资源
最近更新 更多