TypeScript学习(十九):///<reference path=""/> | 八月更文挑战

2,102 阅读3分钟

这是我参与8月更文挑战的第5天,活动详情查看:8月更文挑战

三斜线指令是包括一个单 XML 标签的单行注释。注释的内容在 TS 编译过程中会被用到。

三斜线指令只有位于文件顶层时才会生效。并且,一定位于单行/多行注释前,否则会被当做普通的注释。

///

reference 会让编译器在编译过程中添加一些额外引入的文件。当 tsconfig 文件中配置了 --out 或 --outFile 时,编译后的文件会输出顺序与 /// 的引入顺序一致。

预处理 输入文件

编译器会对输入文件有一个预处理过程,以解析所有的三斜线指令。在这个过程中 额外的文件会被添加入编译器内部。

编译过程以一些列的 根文件 开始,即,在命令行或者 tsconfig.json 中的 files 字段中值(数组)。根文件的处理顺序与其被指定的顺序一致。在文件被添加至清单前,会解析三斜线指令并添加至清单中。

解析过程是深度优先 。其引用路径如果是相对路径,那么是会相对于当前引用文件去解析位置。

错误

两种错误情况

1. 引入不存在的文件

2. /// 自引用

使用 --noResolve

使用 --noResolve 可以关闭对于指令的解析。

///


包引用。包解析过程与 import 时解析模块名称类似。

以 在声明文件中使用 ///为例,声明文件会使用在 @types/node/index.d.ts 文件中的声明。因此,被引入的包会被包含在编译过程中。

使用这个指令的情景是:仅手动编写 d.ts 文件时。

对于在编译过程中产生的声明文件,编译器会自动添加三斜线指令。当且仅当声明文件引用了引入的包中的声明时,在生成的声明文件中才会自动生成三斜线指令,

如果想在 .ts 文件中使用 ///,在命令行中使用 --types 或者在 tsconfig.json 文件中配置一下。

更多细节:www.typescriptlang.org/docs/handbo…

///


这个指令允许文件包含一个内建的 lib 文件。如 es2015.d.ts.

推荐的使用场景:如果声明文件需要以来一些内建的类型,比如 DOM API 或 一些 JS内建的构造函数例如 Symbol 或 Iterable。

内建文件以 三斜线的方式引用 与 在tsconfig.json 文件中 lib 字段中配置是一直的。

下方在文件中使用指令 与 在命令行中使用 --lib es2017.string 效果一致

/// <reference lib="es2017.string">
"foo".padStart(4)

///

这个指令标记一个文件作为默认的库。可以在 lib.d.ts 文件及其不同的变体文件的 顶部 看见这个指令。

这个指令会使编译器在编译过程中不要包含这个默认的库。效果与 在命令行中 使用 --noLib 相似。

注意:当使用 --skipDefaultLibCheck ,编译器仅仅会跳过对文件内 /// 内容的检测。(不懂具体区别。。需要验证一下)

///

使用这个指定,编译后的 JS 文件是一个 AMD 模块

index.ts

/// <amd-module name="NamedModule">
export class C {}

index.js

define("NamedModule", ["require", "exports"], function (require, exports) {  var C = (function () {    function C() {}    return C;  })();  exports.C = C;});

///  


指令已经被废弃了,直接使用 import 语法即可。

该指令通知编译器一个非 TS 模块依赖需要被 注入到模块引用中。

指令有一个可选的 name 属性。

index.ts

/// <amd-dependency path="legacy/mod
ulaA" name="moduleA"/>
declare var moduleA: MyType;
moduleA.callStuff();

index.js

define(["require", "exports", "legacy/moduleA"], function (  require,  exports,  moduleA) {  moduleA.callStuff();});