当///引用在'use strict'之后时,为什么打字稿会抱怨?

时间:2016-02-11 19:50:39

标签: typescript commonjs use-strict typescript1.7

这个问题是我昨天问过的与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);

打字稿不开心:

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

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

这里发生了什么?

3 个答案:

答案 0 :(得分:4)

来自MSDN

  

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

这可能是原因。

答案 1 :(得分:1)

在TypeScript specification中有关于<reference>标记的说明:

  

在{之前}发生的/// <reference path="…"/>形式的评论   源文件中的第一个标记会在源文件中添加依赖项   在path参数中指定。该路径相对于   包含源文件的目录。

答案 2 :(得分:1)

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

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