TypeScript

58 阅读5分钟

Ts支持所有的js代码,并且为js提供了类型提示,使得在编写js代码时就可以获得良好的代码提示,使得js代码更加的安全。提升了可读性和可维护性。最终会由编译器编译为Js代码供浏览器使用。

  1. 适用于周期较长的大型项目 2. 适合团队开发 3. 编写通用的代码库

优势:(1)提供静态类型检查,在写代码阶段就可发现错误。

(2)良好的代码提示,更容易的写代码,减少bug。

安装npm install -g typescript

核心: 定义 任何东西都要 注明类型 调用 任何东西的时候都要 检查类型


ts环境

yarn add global typescript 全局安装ts

tsc -v 查看版本 tsc 文件名 编译文件(最终会编译成js)

在开发环境下,目前的脚手架程序基本上都可以很容易的创建ts环境

一、类型注解

  • 语法:给变量添加类型 在变量后面用 : 来声明类型

使用 type来声明类型,一般首字母需要大写(类型别名)

在变量后可以使用 ? 表示可选,非必传

返回值类型声明为 void 的函数可以 没有返回值

可以使用as 来进行类型断言

never 代表不可达

void 空,可以使undefined和never

any 任意类型

unknown 未知类型,不可以给其他值赋值

二、类型简介

1. 简单类型

TypeScript支持所有js基础类型 number,string, boolean,symbol,undefinde,null

let count:string = '100';

2. 联合类型

使用 | ****来声明联合类型,表示值为多种类型中的一种,typescript类型可以根据赋值来类型推断。

联合类型的类型保护:由于值可能是多种类型中的一个,所以只能使用所有类型的共有属性

为了避免这种情况 可以通过 in 或者 as 断言 来缩小联合类型范围,使代码更加安全

let a: number | string ;  // 表示 a 的类型是 number 和 string 中的一种

3. 交叉类型

使用 & ****来声明联合类型,表示值需要同时满足几种类型,可以配合interface等使用

let a: number & string ;  // 表示 a 的类型是 number 和 string 中的一种

3. 复杂类型

(1)数组 使用 类型[] 或者 泛型 的方式来定义 特点是内部值固定为一种类型,如果需要多种类型请使用元组

let userList:string[] = ['one','two']; //string[] 表示字符串数组
let userList:Array<string> = ['one','two']; // Array<elemType>泛型 规定数组内部值的类型

(2)元组 :可以让同一个数组中同时存在多种类型,特点是适合指定长度的数组,因为要指定数组中每一项的类型

let info:[number,string]; // 指定数组中每一项的类型,赋值必须严格执行
info=[100,'name'];// 数组中的类型和顺序都有要求

(3)函数:函数的类型声明主要针对参数和返回值,一旦声明完毕,参数和返回值必须按照定义来传递。

函数参数如果有默认值,会被ts理解为可选参数

函数的可选参数也有可能会有类型保护的问题:如果用户不传值,就有可能是undefined,无法使用其属性

解决方法:加入if判断是否传值,只有为真时,才取值

// 指定参数的类型和声明变量十分相似
function Add(a:number,b:number):number{
  return a+b;
}

//括号内部为参数类型,外部为返回值类型
type x=(a:number,b:number)=> number // type关键字相当于为后面的类型声明起别名,void可以表示无返回值
const Add:x =(a,b)=>{
	return a+b;
}

// ? 表示可选参数,可选参数必须写到必填参数后面
function add (a:number,b?:string)

(4)interface 接口关键字,声明一个可以继承 ****的对象类型,

注意:首字母大写,有些习惯接口名称首字母加I前缀,变量的值应该和接口规定保持一致

- readonly ****关键字可以在 interface 中声明一个只读属性,不可以二次赋值

- ? ****表示可选属性

- 其他 interface 声明的类型可以使用 ****extends继承 ,变量需要满足子接口和父接口声明的类型

- 类型可以嵌套声明

interface  Idemo{
  redonly name:string;  //只读
  herght?:number// 可选属性
}
interface Ison extends Idemo{
  height:number  //继承Idemo的属性
}

interface NumberArray {
  [index:number]:number; //如果索引是number,值也为number 定义数组类型,不常用
  [index:string]:any; // 定义任意类型
}

interface func{
  (a:string,b:string):string; //接口定义函数
}

4. 泛型

  • 泛型是指在定义函数、接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性
  • 为了类型复用
function Add<t>(a:t,b:t):t{
  return a+b;
}  // 使用t来表示类型待定,等传值时候再指定类型

let c = Add<number>(2,5);// 使用时传值

三、类型运算(高级类型)

1. 条件类型

extends ? : 一般用来对类型参数进行运算

高级类型就是对传入的类型参数进行运算后返回新的类型

type value = T extends U ? true : false // 如果T是U的子类,则返回true,反之为false

2. 推导

infer 提取类型的一部分,通过模式匹配的方式。