gpt4 book ai didi

typescript - "all legal JavaScript is legal TypeScript"是什么意思?

转载 作者:搜寻专家 更新时间:2023-10-30 20:33:26 27 4
gpt4 key购买 nike

我经常听到有人这样说

All JavaScript code is legal TypeScript code

TypeScript is a superset of JavaScript

但是当我编写一些完全合法合理的 JS 代码时,它具有完全确定的行为:

var x = "hello".substr("w").toStrig * { m: 3 / true } + window + parseInt(Element).fzq;

ECMAScript 定义 x 应该有值 "NaN[object Window]undefined" 这看起来完全没问题,但我从 TypeScript 得到了一堆错误!那么“所有 JS 都是 TS”这句话不是谎言吗?怎么回事?

最佳答案

All JavaScript code is legal TypeScript code

这是什么意思:

  • TypeScript 不会改变现有 JavaScript 的语法
  • TypeScript 不会改变现有 JavaScript 的行为
  • TypeScript 确实考虑一些 JS 代码有类型警告,因为这就是重点

语法

TypeScript 将成功解析所有合法的 JavaScript 代码。它将按原样发出此代码(减去降级,例如,如果您的目标是 ES5 或更低版本,ES6 箭头函数将转换为等效的 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

但是规范!

一个常见的反驳是这样的

"The ECMAScript specification defines that Math.max coerces its arguments to a number, so it should be legal to call Math.max(someString, someOtherString)"

的确,ECMAScript 规范明确定义了在运行时发生的强制转换。然而,这种逻辑并没有给我们任何实际的洞察力。从表面上看,这个逻辑表明,因为所有参数在运行时都被强制转换为数字,所以这样写应该是合法的

var x = Math.max("hello", window.setTimeout, { });

毕竟,这段代码确实定义了行为!但这只见树木不见森林——对于“正确”的任何合理定义,这段代码是正确的显然是难以置信的。 TypeScript 的存在是基于这样一种观念,即某些 JavaScript 代码不正确并且您想了解它。

规范描述发生了什么这一事实并不能说明您是否正在编写一个正确程序。医生可以清楚地描述如果你吃了一 block 石头会发生什么,但这并不意味着石头就是食物。

查看旨在指定行为的 ECMAScript 规范,并确定它实际上是描述正确代码的规范性文档,这是一个类别错误。如果你愿意,你可以使用“规范定义的任何东西都应该没问题”的虚无主义理论,并使用从不发出类型警告的 TypeScript 变体。这种变体被广泛使用,被称为“JavaScript”。


*:此规则的异常(exception)情况是降级,由于运行时的限制,它可能具有可检测的差异,例如堆栈跟踪可能不同

关于typescript - "all legal JavaScript is legal TypeScript"是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41750390/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com