当 /// 引用在“use strict”之后时,为啥打字稿会抱怨?

Posted

技术标签:

【中文标题】当 /// 引用在“use strict”之后时,为啥打字稿会抱怨?【英文标题】:Why is typescript complaining when a /// reference is after 'use strict'?当 /// 引用在“use strict”之后时,为什么打字稿会抱怨? 【发布时间】:2016-05-22 18:50:28 【问题描述】:

这个问题与我昨天问的Why is typescript failing to import a module? 有关。初始设置是一样的。

我有一个像这样的简单打字稿文件:

/// <reference path="./typings/js-yaml/js-yaml.d.ts"/>
'use strict';
import * as y from 'js-yaml';
console.log(y);

当我像 tsc --module commonjs file.ts 这样编译时,打字稿很高兴。

但是,当我将 /// 引用移到“use strict”下方时,如下所示:

'use strict';
/// <reference path="./typings/js-yaml/js-yaml.d.ts"/>
import * as y from 'js-yaml';
console.log(y);

Typescript 不开心:

$ tsc --module commonjs file.ts 
file.ts(4,20): error TS2307: Cannot find module 'js-yaml'.

Typescript 确实输出了一个编译后的文件,它与最初的输出相同,当然 /// 引用在第二种情况下的 'use strict' 之后。

这里发生了什么?

【问题讨论】:

【参考方案1】:

引用指令必须位于文件的顶部。当它们不在顶部时,它们会被忽略。这会导致模块解析失败,因为否则编译器不知道在其他随机文件夹中查找js-yaml 模块的定义。

限制的原因仅仅是性能:尝试解析文件中的每个注释以查看它是否是引用指令实际上非常慢(我们尝试过!)。

【讨论】:

这很有意义。如果在手册中更明确地提到这一点,那就太好了。我什至没有想过去阅读规范。如果手册在 github 上,我可以为此做 PR。【参考方案2】:

TypeScript specification 中有一个关于&lt;reference&gt; 标签的注释:

/// &lt;reference path="…"/&gt; 形式的注释出现在 源文件中的第一个标记添加了对源文件的依赖项 在路径参数中指定。路径是相对于 包含源文件的目录。

【讨论】:

【参考方案3】:

来自MSDN,

以下规则适用于引用指令。 引用 XML 注释必须在任何脚本之前声明。

这可能是原因。

【讨论】:

这也许是其中的一部分。但是,这看起来像是用于 VisualStudio 中的 javascript。这不是关于打字稿的参考。

以上是关于当 /// 引用在“use strict”之后时,为啥打字稿会抱怨?的主要内容,如果未能解决你的问题,请参考以下文章

禁用“使用 use strict 的函数形式”,但保留“Missing 'use strict' statement”警告

为什么使用 use strict

(11) 严格模式(use strict)

“use strict”如何修改Javascript中“this”的规则?

“use strict”在 JavaScript 中做了啥,背后的原因是啥?

"use strict"详解