declare
关键字用于声明在其他地方定义的变量、类、函数、命名空间或模块,但不提供具体的实现。通常在编写类型声明文件(.d.ts
文件)时使用,.ts
文件内也可以编写。
declare const count: number;
declare function add(num1: number, num2: number): number;
declare module 'somemodule'
declare namespace SomeNamespace {}
TS有三种类型来源,在编译的时候,会分别加载lib
下的,@types
下的,还有include
和files
的文件进行类型检查。
若要使用,在tsconfig
中配置一下即可
如果lib
没有被指定,那么编译器会根据target
选择默认的库文件。例如,如果target
是es6,那么默认的库文件是["dom", "es6", "dom.iterable", "scripthost"]
。
lib
下是TS内置的标准类型,除此之外,可以通过@types/xxx
下的包进行扩展
@types
包在工程下管理。配置@types
同样是在tsconfig
中
typeRoots
配置读取types的目录,默认是node_modules/@types,如果配置了,就不再读取node_modules/@types。即使是配置空数组,也等于配置了(相当于不设置任何路径)。types
配置要使用的types包,即存在于typeRoots
下的包,如果不配置则代表读取typeRoots
下所有的包,配置了则读取配置了的包,不会读取全部包。即使是配置空数组,也等于配置了(相当于不读取任何包)。当一个包不是用TS写的,可以在上发布一个对应的类型声明包,然后就可以安装下来使用到类型声明。
如果包直接用TS写的,可以通过tsconfig
配置declaration
生成对应的.d.ts
文件。
然后在packages.json
里配置types
属性,这样就不需要发布单独的@types
包了。比如vue
includes
指定路径、files
单独指定部分文件、excludes
排除某些文件
module
: 使用时需要导入es module
: 不论是namespace
还是module
还是.d.ts.ts文件
下定义的类型声明,都可以通过export\import
语法导入导出使用,除此之外TS扩展了导入export type
和import type
语法,用这种方式导出导入时,编译为JS代码后会删掉对应导出导出语句。全局的不需要导入即可直接使用,而模块类型声明要先导入再使用。
如果使用了import或export
语句,当前的类型声明就变为模块的,除此之外全部是全局的。
比如在.d.ts
文件中声明一个接口,外部可以不导入直接使用:
如果.d.ts
文件内存在export或import
,AAA接口会变为模块内的类型声明,使用时需要导入,即使AAA本身并没有使用export
。
没有export也可以直接导入,但如果是在.ts
文件内,必须要导出才能导入使用。
除了.d.ts
,namespace
和module
依然遵循此规则。
也就是,如果使用了import或export
语句,外部只能使用模块内export出去的内容,否则可以使用全部内容。
在上面模块语法部分中,namespace
和module
的例子都没有export,但是都可以直接使用,我们看看namespace
加一个export是什么效果
module
也一样
此时在namespace
和module
中,只有导出的内容外部才可以使用了。
可以通过declare global
在模块内声明全局类型
如果在.d.ts
文件中确实需要导入某些内容又不想影响它的全局性,可以通过三斜线指令实现。
在TS中,/// <reference ... />
指令是一种特殊的注释,它会在TS编译过程中被解析。这种指令可以用于声明文件间的依赖,或者声明对某个类型声明包的依赖。
有如下常用的指令:
/// <reference path="..." />
:用于声明文件间的依赖。例如,如果文件 A 依赖于文件 B,那么可以在 A 文件的顶部添加一行 /// <reference path="B.ts" />
。这告诉TS在编译 A 文件时需要先编译 B 文件。/// <reference types="..." />
:用于声明对某个类型声明包的依赖。例如,如果代码里使用了Node.js
的 API,那么可以在文件的顶部添加一行 /// <reference types="node" />
。这告诉TS这个文件使用了@types/node
包中的类型声明。/// <reference lib="..." />
:不赘述了,就是声明对某个内置类型声明的依赖。需要注意的是,/// <reference ... />
指令只有在文件的顶部才会生效。并且,它必须位于所有单行或多行注释之前,否则它会被视为普通的注释。
因篇幅问题不能全部显示,请点此查看更多更全内容