当 /// 引用在“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 中有一个关于<reference>
标签的注释:
/// <reference path="…"/>
形式的注释出现在 源文件中的第一个标记添加了对源文件的依赖项 在路径参数中指定。路径是相对于 包含源文件的目录。
【讨论】:
【参考方案3】:来自MSDN,
以下规则适用于引用指令。 引用 XML 注释必须在任何脚本之前声明。
这可能是原因。
【讨论】:
这也许是其中的一部分。但是,这看起来像是用于 VisualStudio 中的 javascript。这不是关于打字稿的参考。以上是关于当 /// 引用在“use strict”之后时,为啥打字稿会抱怨?的主要内容,如果未能解决你的问题,请参考以下文章
禁用“使用 use strict 的函数形式”,但保留“Missing 'use strict' statement”警告
“use strict”如何修改Javascript中“this”的规则?