【问题标题】:Double Equals (==) in TypeScriptTypeScript 中的双等号 (==)
【发布时间】:2012-12-06 20:06:47
【问题描述】:

我一直在用 TypeScript 编写一些单元测试。示例 QUnit 测试包含:

  ok( 1 == "1", "Passed!" );

tsc 编译器声称:

运算符“==”不能应用于类型“数字”和“字符串”

并以1 状态退出(尽管它确实正确生成了 JS)。

规范说:

、=、==、!=、=== 和 !== 运算符

这些运算符要求一种操作数类型与另一种操作数类型相同或者是另一种操作数类型的子类型。这 结果始终是布尔原始类型。

所以看起来警告/错误是正确的。这难道不是违背了类型强制 == 运算符的意义吗?有没有在 TypeScript 中使用== 的有效用例不会产生这个警告?

【问题讨论】:

    标签: typescript


    【解决方案1】:

    TypeScript 中==(即类型强制)的至少一种可能情况是预期操作数之一是 Any 类型:

    类型 S 是类型 T 的子类型,而 T 是 S 的超类型,如果一个 以下是正确的:[...]

    T 是 Any 类型。

    现在您可能会看到图片:任何具有 Any 参数的函数都可以安全地(嗯,更多或更少;== 的所有常见陷阱仍然适用于此处)将其与任何集合类型的值进行比较==.

    【讨论】:

      【解决方案2】:

      以下是编译器允许并使用== 的一些常见 TypeScript 示例。

      var a: string = "A";
      var b: Object = "A";
      
      if (a == b) {
          alert("Example 1");
      }
      
      var c: any = "1";
      var d: number = 1;
      
      if (c == d) {
          alert("Example 2");
      }
      
      var e: any = "E";
      var f: string = "E";
      
      if (e == f) {
          alert("Example 3");
      }
      

      【讨论】:

        【解决方案3】:

        TypeScript 的一个要点意味着我们编写的 JavaScript 更清晰。执行 1 == "1" 之类的操作,除非您明确转换它或使用 ToString() / ParseInt() ,否则它将不起作用,具体取决于您希望比较字符串还是数字。

        您可以使用 Any 以使变量的行为与通常的动态 JavaScript 变量一样,但随后您会忽略 TS 的意义,即受益于强大的类型/类型推断系统,该系统可帮助我们避免与许多 JavaScript 发生冲突由于其自动类型强制规则而存在的陷阱。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-11-02
          • 2012-10-06
          • 1970-01-01
          • 2017-08-23
          • 2017-02-08
          • 2021-11-09
          相关资源
          最近更新 更多