一样,不会参与JS的运行!

概述

  1. 什么是声明文件
    1. .d.ts 结尾的文件
  2. 声明文件有什么用?
    1. ts->js,得不到类型声明,声明文件应运而生
    2. 就是为JS代码提供类型声明,但不参与js的运行
  3. 声明文件的位置
    1. 放置到tsconfig.json配置中include包含的目录中
    2. 放置到node_modules/@types文件夹中
    3. 手动配置: tsconfig.json的compilerOptions中配置typeRoots: [],里面是目录相对路径。
      1. 配置此条后,a、b两条均失效
    4. 与JS代码所在目录相同,并且文件名也相同,这种方式最好
      1. 这实际上也是用TS代码书写的工程发布之后的格式

        编写声明文件

        自动生成:
        工程是使用TS开发的,发布(编译)之后,是JS文件
        如果发布的文件,需要开发者使用,可以使用声明文件,来描述发布结果的JS文件中的类型
        配置compilerOptions中的declaration:true

手动编写:

  1. 对已有库,它是使用js书写而成,并且更改该库的代码为TS成本较高,可以手动编写声明文件
  2. 对一些第三方库,他们使用JS书写而成,并且他们没有提供声明文件,可以手动编写声明文件

    全局声明

    global.d.ts 声明一些全局的对象、属性、变量
    namespace: 表示命名空间,可以将其认为是一个对象,命名空间内的内容,必须通过命名空间.成员名访问

    声明模块

    1. //声明模块
    2. declare module "lodash" {
    3. export function chunk<T>(arr:T[], size: number): T[][];
    4. }
    但是上面都写完了,可以build,但是不能npm run dev,为什么呢?看如下

    配置细节

    1. "scripts": {
    2. "test": "echo \"Error: no test specified\" && exit 1",
    3. "dev": "nodemon --watch src -e ts --exec ts-node src/index.ts",
    4. "build": "rmdir /s /q dist & tsc"
    5. },
    在于ts-node那条命令,可以去官方文档看 Help!My Types Are Missing! 这个问题

    大致意思是,没有去读配置 include、exclude,所以它不知道声明文件在哪儿。 因为没有必要把所有的文件编译运行,ts-node根据一个启动文件进行编译(index.ts)

因此可以指明 “typeRoots”: [“./node_modules/@types”, “./src/types”]然后就知道声明文件的位置了

三斜线指令

比如:lodash下的index.d.ts不在对应目录下了,就可以用三斜线指令
三条斜杠,一个空格。三斜线指令前一定不能有任何代码,但可以是其他的三斜线指令

  1. /// <reference path="../../index.d.ts" />

最后记得安装lodash自身声明文件

  1. npm i -D @types/lodash

发布

两种情况:

  1. 当前工程使用TS开发

    1. 编译完成后,将编译结果所在文件夹直接发布到npm上即可
  2. 为其他第三方库开发的声明文件

要发布到@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/你发布到库名