“这是我参与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();});