三斜杠指令是包含单个XML标记的单行注释。注释的内容被用作编译器指令。
三斜杠指令只在包含它们的文件的顶部有效,即在任何注释、语句或声明之前,不然它们会被当作普通的单行注释,无任何特殊含义。
/// <reference path="..." />
该指令用于声明文件之间的依赖关系,指示编译器在编译过程中包含其他额外文件。path
指定的路径如果是相对路径,则是以当前文件为根。
编译器会从根文件开始解析该指令,以深度优先的方式,递归地找到所有编译文件。值得注意的是,根文件必须是由tsconfig.json
文件中的files或include指定。根文件可以是多个文件,在/// <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