TypeScript中的双等于(==)

时间:2012-12-19 12:56:00

标签: typescript

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

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

tsc编译器声称:

  

运算符'=='无法应用于类型'number'和'string'

退出状态为1(虽然它确实正确生成了JS)。

规范说:

  

<,>,< =,> =,==,!=,===和!==运算符

     

这些运算符要求一个操作数类型与另一个操作数类型的子类型相同。该   结果始终是布尔基元类型。

所以看起来警告/错误是正确的。难道这不会打败强制==运营商的类型吗?是否有一个有效的用例在TypeScript中使用== 不会产生此警告?

3 个答案:

答案 0 :(得分:14)

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

  

类型S是类型T的子类型,并且T是S的超类型,如果是的话   以下是真实的:[...]

     

T是Any类型。

现在您可能看到了这样的图片:任何具有Any参数的函数都可以安全地(嗯,更多-o-less; ==的所有常见陷阱仍在此处应用)将其与任何集合的值进行比较输入==

答案 1 :(得分:7)

以下是编译器允许并使用==的一些常见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");
}

答案 2 :(得分:3)

TypeScript的一个要点意味着我们编写了更清晰的JavaScript。执行类似1 ==“1”的操作,除非您明确地使用它或使用ToString()/ ParseInt(),否则它将无法工作,具体取决于您是否希望比较字符串或数字。

你可以使用Any,这样变量就像通常的动态JavaScript变量一样,但是你忽略了TS的优点,它可以从强大的类型推断系统中受益,它可以帮助我们避免违反许多JavaScript由于其自动类型强制规则而存在的陷阱。