每个JavaScript程序都是TypeScript程序吗?

15

Typescript语言规范中提到:

每个JavaScript程序也是TypeScript程序

现在考虑下面的代码:

var i = 5;
i = "five";

这段代码是一个完全有效的JavaScript代码,可以在不出错的情况下执行。但它不是一个有效的TypeScript代码,编译失败。

我的理解与引用语句和代码示例之间显然存在不匹配。

请您澄清一下,在我给出的例子中,是什么使得规范语句成立。

更新

为了回应这个说法不反映程序的有效性的论点,我们可以这样重述:

每个JavaScript程序也是一个有效或无效的TypeScript程序

或者

并非每个JavaScript程序都是一个有效的TypeScript程序

如果作者想表达后者,为什么他们没有这样说呢?


1
显然,该语句存在缺陷(或完全错误,这取决于您对真理的解释)。 - Jaromanda X
我想这相当于 var i: any = 5;,只是这个语句在语言更新时没有被更新吗?(或者我记错了。) - Ry-
1
另一种看待它的方式是...每个JavaScript“程序”也是一个TypeScript“程序”,但不一定是一个有效的TypeScript“程序”。 - Jaromanda X
@zespri - 虚假陈述没有多少意义。规范中的内容是虚假和误导性的。我的第二个(开玩笑的)评论是真实的,一点也不会误导人,所以如果你必须在两者之间选择?(显然,完全删除该声明将是最佳选择) - Jaromanda X
1
@zespri 这取决于它是一个const枚举还是一个常规枚举。请参阅此链接:http://goo.gl/R0GQLe 我认为规范中缺少了这一点,但我不认为这是“一团糟”。 - David Sherret
显示剩余4条评论
3个回答

13

看起来问题似乎是问作为陈述的读法:

每个JavaScript程序也是一个语义正确的TypeScript程序

这个说法是错误的,但这不是这里要表达的意思。

如果你尝试编译这段句法上正确的TypeScript代码...

var i = 5;
i = "five";

如果将一个字符串赋给一个被隐式声明为数字类型的变量,由于其语义不正确,您将会得到一个编译错误。然而,由于其语法是正确的,编译器仍将输出与上面相同的代码到.js文件,并抛出编译错误。

那么,每个JavaScript程序也是一个TypeScript程序吗? 是的,但这并不意味着您不会遇到编译错误。

附注:编译时通过指定--noEmitOnError可以防止编译器在出现错误时发出输出。


更新说明

他们本可以通过限定以下内容来进一步阐述:

 

每个语法正确的JavaScript程序也是一个语法正确的TypeScript程序。

然而,当您查看上下文中的引用时,您会看到段落开头介绍的主要想法已经关于语法:

 

TypeScript是JavaScript的语法糖。 TypeScript语法是Ecmascript 5(ES5)语法的超集。每个JavaScript程序也是一个TypeScript程序。

也许作者认为说“在语法上正确”会重复。


1
这很有道理。我没有意识到即使存在typescript错误,它仍然可以发出javascript。我会在几天内接受答案,而迄今为止,你是赢家=) - Andrew Savinykh
“你可以移除这个条件,得出原本的语句” 这正是我的观点。 - Andrew Savinykh

6
该短语应该针对语法层面。代码
var i = 5;
i = "five";

这是有效的TypeScript语法,但由于TypeScript进行了额外检查,所以将生成编译错误。

基本上,这部分内容表明TypeScript是JavaScript语法的扩展,而不是重构(是否好还要看你的观点)。


什么?这是 TypeScript 中的语法错误。你不是在暗示它是一个语义错误(而不是语法错误),对吧? - Andrew Savinykh
7
@zespri:这不是语法错误。基本上,语句i = "five";是正确的……它是一个表达式语句,其中表达式是一个赋值运算符调用,左侧为标识符,右侧为字面量。要确定这是否有效,还需要进行其他检查,例如符号查找……例如,如果标识符已定义,是否具有正确的类型等。这种检查不是语言语法的一部分。您不会得到“语法错误”,例如,您可能会得到“类型错误”。 - 6502
我不敢苟同。编译器只能检测语法错误这一类型的错误。术语“编译时错误”和“语法错误”是可以互换使用的。考虑单个语句本身是没有意义的,因为在 TypeScript 或 JavaScript 中,单个语句并不是一个编译单元。 - Andrew Savinykh
@zespri:你可以使用任何你喜欢的定义(定义本身从来不会错)。然而,在主流编译技术(标记化/解析/编译)中,通常在需要符号查找时划定了一条界线:只有在该界线之前的内容才是“语法”。 - 6502
5
编译器只能检测语法错误是不正确的。请看一些实行强类型的语言的编译器,这些语言可以在编译时检测类型错误。 - Robert Harvey
@RobertHarvey 是的,我想我在这里错了。基本上我所说的是基于最近发现的Gary Bronson的《C++ for Engineers and Scientists》一书,但是当我拿出Alfred Aho的《Compilers: Principles, Techniques, and Tools》第二版,我认为这是该领域的权威之作,它并不同意Bronson先生的观点。因此,我改正了我的错误。 - Andrew Savinykh

1

是的,这段代码是完全有效的TypeScript。如果在TypeScript应用程序中使用此代码,它仍然会为您生成JavaScript文件。您可以通过以下方式消除警告:

var i: string|number = 5;
i = "five";

当然,因为你有一些类型信息在周围悬挂,TypeScript可以警告您可能会犯的错误。作为回报,您可以改善它使用的类型信息,就像我上面解释的那样,以说明您打算如何使用变量。

现在,我们拥有一个应用程序,允许原始代码,在该代码中i是字符串或数字,但将防止稍后发生意外,例如尝试分配其他内容的情况。


VS2015 生成了 错误 而不是 警告。如果是警告,我还能理解。 - Andrew Savinykh
在团队更认真对待警告之前,最好将其视为错误。如果这是一个真正的错误,而不是故意编码,想象一下调查错误所浪费的时间。 - Fenton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接