0

我有一个这样的枚举:

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; Step2:步骤;[x:数字]:字符串;}':类型'String'缺少来自类型'{ Step1:Steps;的属性'Step1' Step2:步骤;[x:数字]:字符串;}'。

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

4

1 回答 1

1

摘要:调用toString()类型变量any不会返回字符串。您可以使用<string>. 完整的细节如下。

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

enum Steps {
    Step1,
    Step2,
    Step3
}

var propValue = 'Step3';

var currentStep: Steps = Steps[propValue];

看到这个运行

编译器允许在类型上调用任何属性或函数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')];
于 2013-09-16T06:59:59.887 回答