Typescript中的reference(三斜线指令)是什么

三斜杠指令是包含单个XML标记的单行注释。注释的内容被用作编译器指令。
三斜杠指令只在包含它们的文件的顶部有效,即在任何注释、语句或声明之前,不然它们会被当作普通的单行注释,无任何特殊含义。

/// <reference path="..." />

该指令用于声明文件之间的依赖关系,指示编译器在编译过程中包含其他额外文件。path指定的路径如果是相对路径,则是以当前文件为根。

编译器会从根文件开始解析该指令,以深度优先的方式,递归地找到所有编译文件。值得注意的是,根文件必须是由tsconfig.json文件中的filesinclude指定。根文件可以是多个文件,在/// <reference path="..." />中引入不包含在tsconfig.json配置中的文件。

// other/other.ts
console.log('log:other.ts');

/// <reference path="../other/other.ts" />
// print/print.ts
console.log('log:print.ts');
export function hello() {
    console.log('log:Function::hello');
}

/// <reference path="print/print.ts" />
// index.ts
console.log('log:index.ts');
hello();

是否编译后的文件一定会执行呢?

这取决于你的运行环境,和组织代码的方式。

当在浏览器环境中运行代码时,如果你编译后的js文件,都通过script标签加载到了网页中去,理所当然这些文件都会被运行。在上面的示例代码中,要在index.ts文件运行hello方法,则网页中通过script标签加载的print/print.js文件必须放在index.js文件之前。

node环境中,即在本地环境通过node运行编译后的index.js文件,你会发现找不到hello方法的保存。在此环境中,你必须使用require(import)来导入需要的引用。在使用typescript的情况使用import语句后,不需要/// <reference path="..." />也能让编译器识别到被import的文件。

事实上,reference指令的目的是告诉程序可用的function、type或interface的类型,它与声明更加相关。

其他reference指令

  • /// <reference types="..." /> 声明对包的依赖,如/// <reference types="node" />

  • /// <reference lib="..." /> 显式地包含一个现有的内置lib文件,如lib="es2015"

  • /// <reference no-default-lib="true"/> 这个指令将一个文件标记为默认库。在lib.d.ts的顶部可以看到此注释。

  • /// <amd-module /> 默认情况下,AMD模块是默认生成的。在使用其他工具处理生成的模块时,可能会出现问题。所以该指令允许将可选模块名传递给编译器。

参考资料

stackoverflow:Typescript ///: why doesn’t it work for me?
typescript: triple-slash-directives