【问题标题】: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' 之后。

这里发生了什么?

【问题讨论】:

    标签: typescript commonjs use-strict typescript1.7


    【解决方案1】:

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

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

    【讨论】:

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

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

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

    【讨论】:

      【解决方案3】:

      来自MSDN

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

      这可能是原因。

      【讨论】:

      • 这也许是其中的一部分。但是,这看起来像是用于 VisualStudio 中的 javascript。这不是关于打字稿的参考。
      猜你喜欢
      • 2021-04-26
      • 2018-10-14
      • 1970-01-01
      • 2022-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-04
      相关资源
      最近更新 更多