在TypeScript中从DOM属性转换为枚举

时间:2013-09-16 00:50:14

标签: javascript enums typescript

我有这样的枚举:

enum Steps {
    Step1,
    Step2,
    ...
}

我尝试过以几种不同的方式使用它:

var cur_step : Steps = Steps[$(this).prop('data-step').toString()]; // compiler error
var str : string = $(this).prop('data-step').toString(); // no error
var cur_step : Steps = Steps[$(this).attr('data-step')];
var cur_step : Steps = Steps[String($(this).prop('data-step'))];
var cur_step : Steps = Steps[<string>$(this).prop('data-step')];

从属性到枚举的第一次转换给我一个编译器错误:

  

无法将'string'转换为'{Step1:Steps;第二步:步骤; [x:number]:字符串; '':Type'String'缺少类型'{Step1:Steps;'的属性'Step1'。第二步:步骤; [x:number]:字符串; }”。

为什么第一种方法不起作用? toString()lib.d.ts中的方法的所有实例返回基本类型的字符串。

1 个答案:

答案 0 :(得分:1)

摘要:在toString()类型的变量上调用any不会返回字符串。您可以使用<string>进行投射。详情如下。

从字符串到枚举的转换正如您所描述的 - 这是一个绝对有效的示例...

enum Steps {
    Step1,
    Step2,
    Step3
}

var propValue = 'Step3';

var currentStep: Steps = Steps[propValue];

See this running

编译器允许在any类型上调用任何属性或函数(在您的情况下,prop返回any)并且它不会推断结果。因此,假设此实例中的toString()不是返回字符串的真实版本。以下是使用代码的示例:

var x = $(this).prop('data-step').toString(); // x is any

这个例子的简短版本证明了这一点:

var d: any;
d = 'test';
var e = d.toString(); // e is any

因此,为了在一行中解决这个问题,您可以使用:

var currentStep: Steps = Steps[<string>$(this).prop('data-step')];