类型演算
三个关键字
typeof
当typeof作用于类的时候,得到的类型是该类的构造函数
keyof
作用于类、接口、类型别名,用于获取其他类型中的所有成员名组成的联合类型
in
该关键字往往与keyof联用,限制某个索引类型的取值范围。
TS中预设的类型演算
Partial<T> // 将类型T中的成员变为可选Required<T> // 将类型T中的成员变为必填Readonly<T> // 类型T中的成员变为只读Exclude<T,U> // 从T中剔除可以赋值给U的类型Extract<T,U> // 提取T中可以赋值给U的类型NonNullable<T> // 从T中剔除null和undefinedReturnType<T> // 获取函数返回值类型InstanceType<T> // 获取构造函数类型的示例类型
声明文件
概述
以.d.ts结尾的文件就是声明文件。
为JS代码提供类型声明
-
声明文件位置
- 放置到
tsconfig.json配置中包含的目录中 - 放置到
node_modules/@types文件夹中 - 手动配置
'typeRoots':['./types'],将覆盖前两种方式 - 与JS代码所在目录相同,并且文件名也相同的文件。用ts代码书写的工程发布之后的格式。
- 放置到
编写
自动生成
工程是使用ts开发的,发布( 编译)之后,是js文件,发布的是js文件。如果发布的文件,需要其他开发者只用,可以使用声明文件,来描述发布结果中的类型。
// 在tsconfig.json中配置即可"declaration":true
手动编写
需要手动编写的情况:
- 对衣优库,它是使用js书写而成,并且更改该库的代码为ts成本较高,可以手动编写声明文件
- 对一些第三库,它们使用js书写而成,并且这些第三方库没有提供声明文件,可以手动编写声明文件
全局声明
声明一些全局的对象、属性、变量
// global.d.ts// 比如声明一个console.log()declare var console:{log(message?:any):void};// 比如声明setTimeoutdeclare function setTimeout(() => void , miliseconds : number) : number
模块声明
declare module "lodash" {export function chunk<T>(array:T[],size:number):T[][]}
三斜线指令
在一个声明文件中,包含另一个声明文件
<reference path="../../index.d.ts">
发布
当前工程使用ts开发
编译完成后,将编译结果所在文件夹直接发布到npm上即可
为其他第三方文库发布声明文件
发布到@type/**中。
- 进入github的开源项目:https://github.co/DefinitelyTyped/DefinitelyTyped
- fork到自己的开源库中
- 从自己的开源库中克隆到本地
- 本地新建分支,在新分支中开发,在types目录中新建文件夹,在新的文件夹中开发声明文件
- push分支到你的开源库
- 到官方的开源库中,提交pull request
- 等待官方管理员审核(1天),审核通过之后,会将你的分支代码合并到主分支,然后发布到npm
- 就可以通过命令
npm install @types/你的库名进行使用。
