我一直在用TypeScript编写一些单元测试。示例QUnit测试包含:
ok( 1 == "1", "Passed!" );
tsc
编译器声称:
运算符'=='无法应用于类型'number'和'string'
退出状态为1
(虽然它确实正确生成了JS)。
规范说:
<,>,< =,> =,==,!=,===和!==运算符
这些运算符要求一个操作数类型与另一个操作数类型的子类型相同。该 结果始终是布尔基元类型。
所以看起来警告/错误是正确的。难道这不会打败强制==
运营商的类型吗?是否有一个有效的用例在TypeScript中使用==
不会产生此警告?
答案 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由于其自动类型强制规则而存在的陷阱。