我经常听到有人这样说。
所有JavaScript代码都是合法的TypeScript代码。
或
TypeScript是JavaScript的超集
但是,当我编写了一些完全合法和合理的JS代码时,这些代码具有完全确定性的行为:
var x = "hello".substr("w").toStrig * { m: 3 / true } + window + parseInt(Element).fzq;ECMAScript定义了x应该有一个值"NaN[object Window]undefined",这看起来很好,但是我从TypeScript那里得到了很多错误!那么,这个“所有的JS都是TS”的说法不是一个谎言吗?怎么回事?
发布于 2017-01-19 19:47:45
所有JavaScript代码都是合法的TypeScript代码。
这意味着:
语法
TypeScript将成功解析所有合法的JavaScript代码。它将以-is发出此代码(减去降级,例如,如果您针对的是ES6或更低的ES5代码,则将ES5箭头函数转换为等效的ES5代码)。如果您愿意,可以忽略此JS代码生成的类型警告;类型警告不会阻止TypeScript编写输出.js文件。
行为
TypeScript不会改变现有JavaScript代码的行为,即使很多人希望它改变!通过编译器运行的任何JS代码的行为都将与直接运行相同。
类型警告
TypeScript可能对它认为不正确的代码发出类型警告。
什么是不正确的意思?注意,JavaScript是确定性的。例如,与C++不同的是,根本不可能导致“实现定义”的行为。JavaScript也很少抛出异常;与其他语言不同,其他语言在试图将对象乘成函数时可能会引发异常,JS生成NaN。使用错误的名称访问属性将产生undefined,而不是运行时错误(这让每个人都很懊恼)。因此,这里的“不正确”栏是故意设置的,比“崩溃您的计算机”或“抛出异常”更严格。
例如,有些代码都是合法的JavaScript,甚至不抛出异常。TypeScript认为这些行中的每一行都有错误;使用这些行的人通常认为这是一个积极的错误:
var x = { } + 3; // Error, can't add objects and numbers
var y = "hello world".substr(1, 2, 3, 4, 5); // Error, too many parameters
var z = { x: 1, x: 2 }; // Error, duplicate property 'x'
var q = x[z]; // Error, indexing by an object doesn't really work...
var u = "hi".lenth; // Error, no property 'lenth' on string但是规格!
一种常见的反驳是这样的
“ECMAScript规范定义了
Math.max将其参数强制为一个数字,因此调用Math.max(someString, someOtherString)是合法的”
确实,ECMAScript规范明确定义了在运行时发生的矫顽器。然而,这种逻辑并没有给我们任何实际的洞察力。从表面上看,这一逻辑表明,由于所有参数都是在运行时被强制编号的,因此写入应该是合法的。
var x = Math.max("hello", window.setTimeout, { });毕竟,这段代码确实有定义的行为!但这忽略了树木的森林-这显然是难以置信的,这个代码是正确的任何合理定义的“正确”。类型记录的存在是基于这样一个概念,即某些JavaScript代码是不正确的,您希望了解它。
规范描述所发生的事情并不能说明您是否正在编写正确的程序。医生可以清楚地描述如果你吃石头会发生什么,但这并不意味着石头就是食物。
查看ECMAScript规范是一个类别错误,该规范旨在指定行为,并确定它实际上是描述正确代码的规范性文档。如果您愿意,您可以使用虚无主义的理论,即“规范定义的任何内容都应该是安全的”,并使用TypeScript的一个变体,它从不发出类型警告。这个变体是广泛可用的,并被称为"JavaScript“。
*:此规则的例外是降级,由于运行时的限制,可能存在可检测到的差异,例如堆栈跟踪可能有所不同。
https://stackoverflow.com/questions/41750390
复制相似问题