【问题标题】:Converting from DOM property to enum in TypeScript在 TypeScript 中从 DOM 属性转换为枚举
【发布时间】:2013-09-16 00:50:13
【问题描述】:

我有一个这样的枚举:

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 中方法的所有实例返回一个基本类型的字符串。

【问题讨论】:

    标签: javascript enums typescript


    【解决方案1】:

    总结:对any 类型的变量调用toString() 不会返回字符串。您可以改用&lt;string&gt; 进行投射。详情如下。

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

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

    【讨论】:

    • 您已确认我的用法,但我不相信您已回答我的问题。我没有得到的是,当我查看 lib.d.ts 的所有接口中 toString() 的所有声明时,它是 toString(): string; (甚至是所有接口之外的全局声明函数 toString)所以怎么调用 toString () 在 Any 类型上返回 Any,这是在某处定义或声明的吗?
    • 当你在any 类型的变量上调用任何方法时,它将返回any。这包括toStringmadeUpThinganythingYouLike。这来自规范的第 3.1 节:supports the same operations as a value in JavaScript and minimal static type checking is performed for operations
    • 如果 jQuery 中的 prop 调用返回一个字符串,jquery.d.ts 可以修改 - 我必须先检查 jQuery 文档。
    • jquery.d.ts 中的 prop 正确返回 Any 因为属性可以保存数字、布尔值、json,所以那里没有混淆。我查看了规范,它不像我想要的那样具体或确定。这意味着由于没有太多类型检查,它总是默认为Any,但实际上并没有说明它。接受为我清理它,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多