ChatGPT解决这个技术问题 Extra ChatGPT

TypeScript 文件中需要“使用严格”吗?

我看过有关在 TypeScript 代码文件中将“use strict”行放在何处的帖子。我的问题是,为什么要拥有它?

既然 TypeScript 已经是一种强类型语言,那么“use strict”又增加了什么?

您提供的链接定义了 JavaScript 文件中“使用严格”的含义。我的问题是它在 TypeScript 文件中是否仍然有用/需要,其中 TypeScript 和启用 Typescript 的编辑器将捕获大多数/所有(?)“使用严格”会捕获的问题。
如果您将它构建到 ES6 然后使用 Babel 之类的东西,您还需要它,它需要生成的脚本包含 "use strict";
不要放在 TS 文件中,在 tsconfig.json 中添加标志 --alwaysStrict:Parse in strict mode 并为每个源文件发出“use strict”
use strict 与 ECMAScript 5 严格模式有关。我写了一篇关于 Typescript 严格类型的文章。Check here 详细解释

D
David Sherret

更新

TypeScript 1.8+:“使用严格”;在模块中发出(阅读更多)。

TypeScript 2.1+:--alwaysStrict 编译器选项以严格模式解析所有文件,并在所有输出文件的顶部发出“use strict”(阅读更多)。

您可以通过在 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;"
O
Oleg Valter is with Ukraine

为了我的钱,是的"use strict"; 应该包含在 TypeScript 文件中。

忽略 "use strict"; 对 TypeScript 的 compile time 影响,执行生成的 JavaScript 时可能会产生 runtime 影响:

MDN 确定了避免在函数调用中装箱以及删除 function.caller 和 function.arguments 属性的性能改进。

Mozilla 的 Jeff Walden 也在这个答案中暗示了性能提升的机会。


您使用 ECMAScript 严格模式的观点是有效的,但正如在接受的答案中指出的那样,最好通过启用“alwaysStrict”TypeScript 编译器选项来实现这一点,而不是将其手动包含在您的 .ts 文件中。
@bgh 我同意。但请注意,问题和答案早于 --alwaysStrict(在 2.1 版中引入)。因此,当提出问题时,“应该 "use strict" 在 TS 源中”和“应该 "use strict" 在发出的输出中”之间没有区别。
我认为已接受答案上的“更新:使用 --alwaysStrict”注释就足够了,但如果您有不同的感觉,请编辑此注释以添加类似的内容。