类型演算

三个关键字

typeof

当typeof作用于类的时候,得到的类型是该类的构造函数

keyof

作用于类、接口、类型别名,用于获取其他类型中的所有成员名组成的联合类型

in

该关键字往往与keyof联用,限制某个索引类型的取值范围。

TS中预设的类型演算

  1. Partial<T> // 将类型T中的成员变为可选
  2. Required<T> // 将类型T中的成员变为必填
  3. Readonly<T> // 类型T中的成员变为只读
  4. Exclude<T,U> // 从T中剔除可以赋值给U的类型
  5. Extract<T,U> // 提取T中可以赋值给U的类型
  6. NonNullable<T> // 从T中剔除null和undefined
  7. ReturnType<T> // 获取函数返回值类型
  8. InstanceType<T> // 获取构造函数类型的示例类型

声明文件

概述

  1. 什么是声明文件


.d.ts结尾的文件就是声明文件。

  1. 声明文件的作用


为JS代码提供类型声明

  1. 声明文件位置

    • 放置到tsconfig.json配置中包含的目录中
    • 放置到node_modules/@types文件夹中
    • 手动配置'typeRoots':['./types'],将覆盖前两种方式
    • 与JS代码所在目录相同,并且文件名也相同的文件。用ts代码书写的工程发布之后的格式。

编写

自动生成

工程是使用ts开发的,发布( 编译)之后,是js文件,发布的是js文件。如果发布的文件,需要其他开发者只用,可以使用声明文件,来描述发布结果中的类型。

  1. // tsconfig.json中配置即可
  2. "declaration":true

手动编写

需要手动编写的情况:
  1. 对衣优库,它是使用js书写而成,并且更改该库的代码为ts成本较高,可以手动编写声明文件
  2. 对一些第三库,它们使用js书写而成,并且这些第三方库没有提供声明文件,可以手动编写声明文件

全局声明

声明一些全局的对象、属性、变量

  1. // global.d.ts
  2. // 比如声明一个console.log()
  3. declare var console:{
  4. log(message?:any):void
  5. };
  6. // 比如声明setTimeout
  7. declare function setTimeout(() => void , miliseconds : number) : number

模块声明
  1. declare module "lodash" {
  2. export function chunk<T>(array:T[],size:number):T[][]
  3. }

三斜线指令

在一个声明文件中,包含另一个声明文件

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

发布

当前工程使用ts开发

编译完成后,将编译结果所在文件夹直接发布到npm上即可

为其他第三方文库发布声明文件

发布到@type/**中。

  1. 进入github的开源项目:https://github.co/DefinitelyTyped/DefinitelyTyped
  2. fork到自己的开源库中
  3. 从自己的开源库中克隆到本地
  4. 本地新建分支,在新分支中开发,在types目录中新建文件夹,在新的文件夹中开发声明文件
  5. push分支到你的开源库
  6. 到官方的开源库中,提交pull request
  7. 等待官方管理员审核(1天),审核通过之后,会将你的分支代码合并到主分支,然后发布到npm
  8. 就可以通过命令npm install @types/你的库名进行使用。