概述
- 什么是声明文件
- 以 .d.ts 结尾的文件
- 声明文件有什么用?
- ts->js,得不到类型声明,声明文件应运而生
- 就是为JS代码提供类型声明,但不参与js的运行
- 声明文件的位置
- 放置到tsconfig.json配置中include包含的目录中
- 放置到node_modules/@types文件夹中
- 手动配置: tsconfig.json的compilerOptions中配置typeRoots: [],里面是目录相对路径。
- 配置此条后,a、b两条均失效
- 与JS代码所在目录相同,并且文件名也相同,这种方式最好
手动编写:
- 对已有库,它是使用js书写而成,并且更改该库的代码为TS成本较高,可以手动编写声明文件
- 对一些第三方库,他们使用JS书写而成,并且他们没有提供声明文件,可以手动编写声明文件
全局声明
global.d.ts 声明一些全局的对象、属性、变量
namespace: 表示命名空间,可以将其认为是一个对象,命名空间内的内容,必须通过命名空间.成员名访问声明模块
但是上面都写完了,可以build,但是不能npm run dev,为什么呢?看如下//声明模块
declare module "lodash" {
export function chunk<T>(arr:T[], size: number): T[][];
}
配置细节
在于ts-node那条命令,可以去官方文档看 Help!My Types Are Missing! 这个问题"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"dev": "nodemon --watch src -e ts --exec ts-node src/index.ts",
"build": "rmdir /s /q dist & tsc"
},
大致意思是,没有去读配置 include、exclude,所以它不知道声明文件在哪儿。 因为没有必要把所有的文件编译运行,ts-node根据一个启动文件进行编译(index.ts)
因此可以指明 “typeRoots”: [“./node_modules/@types”, “./src/types”]然后就知道声明文件的位置了
三斜线指令
比如:lodash下的index.d.ts不在对应目录下了,就可以用三斜线指令
三条斜杠,一个空格。三斜线指令前一定不能有任何代码,但可以是其他的三斜线指令
/// <reference path="../../index.d.ts" />
最后记得安装lodash自身声明文件
npm i -D @types/lodash
发布
两种情况:
当前工程使用TS开发
- 编译完成后,将编译结果所在文件夹直接发布到npm上即可
为其他第三方库开发的声明文件
要发布到@types/下**
1). 进入github开源项目:https://github.com/DefinitelyTyped/DefinitelyTyped
2). fork到自己的开源库中
3). 从自己的开源库中克隆到本地
4). 本地新建分支(例如:mylodash4.3),在新分支中进行声明文件的开发
a. 在types目录中新建文件夹,在新的文件夹中开发声明文件
5). push分支到你的开源库
6). 到官方开源库中,提交new pull request
7). 等待官方管理员审核(1天)
审核通过之后,会将你的分支发布到主分支,然后发布到npm
之后,就可以通过命令 npm install @types/你发布到库名