属性在打字稿接口上不存在

Property Doesn't Exist on Typescript Interface

本文关键字:接口 不存在 属性      更新时间:2023-09-26

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

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接口的情况下执行此操作?我认为这将是过度工程化。

当你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;

这样,您将拥有类型安全和自动完成功能。