搜索
您的当前位置:首页正文

TS 类型来源和模块语法

来源:易榕旅网

declare

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下的,还有includefiles的文件进行类型检查。

1. 内置类型声明(lib)

若要使用,在tsconfig中配置一下即可

如果lib没有被指定,那么编译器会根据target选择默认的库文件。例如,如果target是es6,那么默认的库文件是["dom", "es6", "dom.iterable", "scripthost"]

2. @types

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

3. 其他代码(include\exclude\files)

includes指定路径、files单独指定部分文件、excludes排除某些文件


模块语法

  1. module 使用时需要导入

  1. es module 不论是namespace还是module还是.d.ts.ts文件下定义的类型声明,都可以通过export\import语法导入导出使用,除此之外TS扩展了导入export typeimport type语法,用这种方式导出导入时,编译为JS代码后会删掉对应导出导出语句。

全局类型声明和模块类型声明

全局的不需要导入即可直接使用,而模块类型声明要先导入再使用。

如果使用了import或export语句,当前的类型声明就变为模块的,除此之外全部是全局的。

比如在.d.ts文件中声明一个接口,外部可以不导入直接使用:

如果.d.ts文件内存在export或import,AAA接口会变为模块内的类型声明,使用时需要导入,即使AAA本身并没有使用export

没有export也可以直接导入,但如果是在.ts文件内,必须要导出才能导入使用。

除了.d.tsnamespacemodule依然遵循此规则。

也就是,如果使用了import或export语句,外部只能使用模块内export出去的内容,否则可以使用全部内容。

在上面模块语法部分中,namespacemodule的例子都没有export,但是都可以直接使用,我们看看namespace加一个export是什么效果

module也一样

此时在namespacemodule中,只有导出的内容外部才可以使用了。

模块内声明全局类型

可以通过declare global在模块内声明全局类型

/// <reference … />

如果在.d.ts文件中确实需要导入某些内容又不想影响它的全局性,可以通过三斜线指令实现。

在TS中,/// <reference ... /> 指令是一种特殊的注释,它会在TS编译过程中被解析。这种指令可以用于声明文件间的依赖,或者声明对某个类型声明包的依赖。

有如下常用的指令:

  1. /// <reference path="..." />:用于声明文件间的依赖。例如,如果文件 A 依赖于文件 B,那么可以在 A 文件的顶部添加一行 /// <reference path="B.ts" />。这告诉TS在编译 A 文件时需要先编译 B 文件。
  2. /// <reference types="..." />:用于声明对某个类型声明包的依赖。例如,如果代码里使用了Node.js的 API,那么可以在文件的顶部添加一行 /// <reference types="node" />。这告诉TS这个文件使用了@types/node包中的类型声明。
  3. /// <reference lib="..." />:不赘述了,就是声明对某个内置类型声明的依赖。

需要注意的是,/// <reference ... /> 指令只有在文件的顶部才会生效。并且,它必须位于所有单行或多行注释之前,否则它会被视为普通的注释。

因篇幅问题不能全部显示,请点此查看更多更全内容

Top