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

Converting from DOM property to enum in TypeScript

本文关键字:转换 枚举 属性 DOM TypeScript 中从      更新时间:2023-09-26

我有一个这样的枚举:

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')];

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

无法将"字符串"转换为"{ 步骤1:步骤;步骤2:步骤;[x:数字]:字符串;}':类型"字符串"缺少类型"{ 步骤1:步骤"中的属性"步骤1";步骤2:步骤;[x:数字]:字符串;}'.

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

摘要:对 any 类型的变量调用 toString() 不会返回字符串。您可以改用 <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')];