Ts支持所有的js代码,并且为js提供了类型提示,使得在编写js代码时就可以获得良好的代码提示,使得js代码更加的安全。提升了可读性和可维护性。最终会由编译器编译为Js代码供浏览器使用。
-
适用于周期较长的大型项目 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 提取类型的一部分,通过模式匹配的方式。