TypeScript 文件中需要“使用严格”吗?
Posted
技术标签:
【中文标题】TypeScript 文件中需要“使用严格”吗?【英文标题】:"Use Strict" needed in a TypeScript file? 【发布时间】:2015-10-02 05:06:24 【问题描述】:我已经看到有关在 TypeScript 代码文件中将“use strict”行放在何处的帖子。我的问题是,为什么要拥有它?
既然 TypeScript 已经是一种强类型语言,那么“use strict”又增加了什么?
【问题讨论】:
***.com/questions/1335851/… 您提供的链接定义了 javascript 文件中“使用严格”的含义。我的问题是它在 TypeScript 文件中是否仍然有用/需要,在该文件中,TypeScript 和启用 Typescript 的编辑器将捕获大多数/所有(?)“使用严格”会捕获的问题。 如果你将它构建到 ES6 然后使用 Babel 之类的东西,你也需要它,它需要生成的脚本包含"use strict";
不要放在 TS 文件中,在 tsconfig.json 中添加标志 --alwaysStrict:Parse in strict mode 并为每个源文件发出“use strict”
use strict
与 ECMAScript 5 严格模式有关。我写了一篇关于Typescript strict type的文章。Check here详细解释
【参考方案1】:
为了我的钱,是的,"use strict";
应该包含在 TypeScript 文件中。
忽略 "use strict";
对 TypeScript 的编译时间影响,执行生成的 JavaScript 时可能会有运行时影响:
MDN identifies performance improvements 避免在函数调用中装箱 this
,并删除 function.caller
和 function.arguments
属性。
Mozilla 的 Jeff Walden 也在 this answer 中暗示了性能提升的机会。
【讨论】:
您使用 ECMAScript 严格模式的观点是有效的,但正如接受的答案中指出的那样,最好通过启用“alwaysStrict”TypeScript 编译器选项来实现这一点,而不是手动将其包含在您的 . ts 文件。 @bgh 我同意。请注意,问题和答案早于--alwaysStrict
(在2.1 版中引入)。因此,当提出问题时,“"use strict"
应该在 TS 源中”和“"use strict"
应该在发出的输出中”之间没有区别。
我认为已接受答案上的“更新:使用--alwaysStrict
”说明就足够了,但如果您有不同的感觉,请编辑此内容以添加类似内容。【参考方案2】:
更新
TypeScript 1.8+:"use strict";
在模块中发出 (Read more)。
TypeScript 2.1+:--alwaysStrict
编译器选项以严格模式解析所有文件,并在所有输出文件的顶部发出 "use strict"
(Read more)。
您可以通过在 TypeScript 的测试中搜索“严格模式”来找到一些示例列表。
这里有一些代码示例,它们只会在您"use strict";
时引发编译时错误:
// future reserved keyword not allowed as variable name
var let,
yield,
public,
private,
protected,
static,
implements;
// "delete" cannot be called on an identifier
var a;
delete a;
// octal literals not allowed
03;
还有几个例子,"use strict";
只会在运行时抛出错误。例如:
"use strict";
delete Object.prototype;
就我个人而言,我发现它在防止我在 TypeScript 中犯错误方面并没有多大用处,而且它添加到文件中的额外噪音让我懒得写它。也就是说,从 TS 2.1 开始,我将启用 --alwaysStrict
编译器选项,因为它增加了一点额外的严格性,而没有任何代码维护开销。
【讨论】:
很酷,TypeScript 单元测试涵盖了这一点。我会检查一下。感谢您的示例。我同意不再将它包含在我们的 TypeScript“编码标准”中。 请注意,如果您使用外部模块,则在 TS 文件顶部声明的任何use strict
字符串可能会出现在模块函数中而不是文件顶部,因此会稍微改变语义。
在我的机器上,TypeScript 1.4 在面向 ECMAScript 5 或更高版本时不允许使用八进制文字,即使不使用 "use strict;"
以上是关于TypeScript 文件中需要“使用严格”吗?的主要内容,如果未能解决你的问题,请参考以下文章
使用严格的空检查处理 Typescript 2.0 中的数组移位返回类型
如何使用严格类型的有效负载发出事件? | Vue 3 组合 API + TypeScript