1

这个问题与为什么打字稿无法导入模块有关?,我昨天问的。初始设置是相同的。

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

/// <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”之后。

这里发生了什么?

4

3 回答 3

4

来自MSDN

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

这可能是原因。

于 2016-02-11T19:58:05.407 回答
1

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

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

于 2016-02-11T21:43:17.233 回答
1

<reference>TypeScript规范中有一个关于标签的注释:

在源文件中的第一个标记之前出现的形式的注释/// <reference path="…"/>添加了对路径参数中指定的源文件的依赖。该路径是相对于包含源文件的目录进行解析的。

于 2016-02-11T20:07:31.420 回答