在Typescript接口上不存在属性

时间:2016-02-09 17:29:34

标签: javascript interface typescript

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

    // Authentication Routes...
    Route::get('login', 'Auth\AuthController@showLoginForm');
    Route::post('login', 'Auth\AuthController@login');
    Route::get('logout', 'Auth\AuthController@logout');

    // Registration Routes...
    Route::get('register', 'Auth\AuthController@showRegistrationForm');
    Route::post('register', 'Auth\AuthController@register');

    // Password Reset Routes...
    Route::get('password/reset/{token?}', 'Auth\PasswordController@showResetForm');
    Route::post('password/email', 'Auth\PasswordController@sendResetLinkEmail');
    Route::post('password/reset', 'Auth\PasswordController@reset');

我的枚举就像这样 -

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

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

但是,打字稿编译器抱怨IMyEnum类型中不存在“正常”。

/// <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' }
  }
}

在没有定义let statusCode = StatusEnum.Normal.value; 界面的情况下,有没有这样做?我认为这会过度工程化。

1 个答案:

答案 0 :(得分:2)

当您将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;

这样你就可以拥有类型安全和自动完成功能。