我有一个自定义的“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;
界面的情况下,有没有这样做?我认为这会过度工程化。
答案 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;
这样你就可以拥有类型安全和自动完成功能。