16

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

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

编译器tsc声称:

运算符 '==' 不能应用于类型 'number' 和 'string'

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

规范说:

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

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

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

4

3 回答 3

15

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

如果满足以下条件之一,则类型 S 是类型 T 的子类型,而 T 是 S 的超类型:[...]

T 是 Any 类型。

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

于 2012-12-19T13:10:13.313 回答
8

以下是编译器允许并使用==.

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");
}
于 2012-12-19T17:51:35.090 回答
4

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

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

于 2012-12-19T13:44:06.230 回答