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.callerfunction.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

我可以在 Nodejs 项目中同时使用 ES5 和 Typescript 吗?

在 TypeScript 中使用 jQuery 插件

TypeScript 有像 Kotlin 这样的扩展吗?

Typescript:至少有一个T类型属性的对象。