深入浅出TypeScript
是JavaScript的超集,用于解决大型项目的代码复杂性,类型安全,完善的工具链
特点:
- 强类型,支持静态和动态类型
- 可以在编译期间发现并纠正错误
- 不允许改变变量的数据类型
TS基础
类型:
- Boolean、number、string
- 枚举enum
- any、unknown、void
- never(永远不存在值)
- 数组类型[]
- 元组类型tuple
函数类型
定义输入参数类型和输出类型
输入参数:支持可选参数(可选参数只需在参数名后跟随一个?即可)和默认参数(当为参数指定了默认参数时,TypeScript 会识别默认参数的类型;当调用函数时,如果给这个带默认值的参数传了别的类型的参数则会报错)
输出参数:输出可以自动推断,没有返回值时,默认void类型
函数重载:TypeScript的函数重载通过为一个函数指定多个函数类型定义,从而对函数调用的返回值进行检查
注:TypeScript 中可以为剩余参数指定类型,函数重载只能用 function 来定义,不能使用接口、类型别名来定义
接口
接口是为了定义对象类型
特点:
-
可选属性:?
-
只读属性:readonly,只允许出现在属性声明或索引签名或构造函数中 ,如果 readonly 和其他访问修饰符同时存在的话,需要写在其后面
-
class Animal { readonly name; public constructor(name) { this.name = name; } } let a = new Animal('Jack'); console.log(a.name); // Jack a.name = 'Tom';
-
-
可以描述函数类型
-
可以描述自定义属性
类
比JavaScript增加了一些定义
特点:
- 增加了public、private、protected修饰符
- public 修饰的属性或方法是公有的,可以在任何地方被访问到,默认所有的属性和方法都是 public 的
- private 修饰的属性或方法是私有的,不能在声明它的类的外部访问
- protected 修饰的属性或方法是受保护的,它和 private 类似,区别是它在子类中也是允许被访问的
- 抽象类:只能被继承,不能被实例化,作为基类,抽象方法必须被子类实现
- interface约束类,使用implements关键字
TS进阶
高级类型
1.联合类型|
// 联合类型 (只需满足其中一个接口类型所定义的属性)
let lhType : myInter1 | myInter2={
name:'',
fun1(): void {}
}
class Dog1{
constructor(public name: string) {}
run(){
console.log(this.name)
}
}
class Dog2{
constructor(public age: number) {}
run(){
console.log(this.age)
}
}
// 如果变量类型是多个类的联和,那么
function f(num:number) {
let lhType = num===1?new Dog1('rose'):new Dog2(3)
// 此时lhType去调用类中的方法时,只能调用他们的相同属性名的值
lhType.run()
}
2.交叉类型&,交叉类型是将多个类型合并为一个类型
interface myInter1 {
name:string;
fun1():void
}
interface myInter2 {
fun2():void
}
// 此时定义的jcType是myInter1和myInter2的交叉类型,其中必须包含这两个接口中定义的属性
let jcType :myInter1 & myInter2 = {
name:'haha',
fun1() {},
fun2() {},
}
3.类型断言
4.类型别名(type vs interface)
-定义:给类型起个别名
相同点:
-
都可以定义对象或者函数
-
都允许继承
不同点:
- interface是用来定义对象,type用来定义别名方便使用
- type可以定义基本类型,interface不行
- interface可以合并重复声明,type不行
参考链接:www.jianshu.com/p/d872dc8b7…
泛型
解决输入输出可关联的定义
语法是<>里面写类型参数,一般用T表示
使用时有2种方法指定类型:定义要使用的类型/通过TS类型推断,自动推导类型
泛型的作用是临时占位,之后通过传来的类型进行推导
基础操作符:
-
typeof:获取类型
-
keyof:获取所有键
-
in:遍历枚举类型
-
T[k]:索引访问
-
extends:泛型约束
常用工具类型:
- Partial:将类型 T 中的所有属性变为可选属性。
- Required:将类型T中的所有可选属性变为必选属性。
- Pick<T,K>:可以将类型T中选择指定的属性K,生成一个新的属性。
- Omit<T, K>:从类型 T 中删除指定的属性 K,生成一个新的类型。
- Record<K, T>: 它可以生成一个类型为 T 的对象,其中属性名的类型为 K。
TS实战
声明文件
在typescript中存在两种文件后缀名,一种是 .ts,另一种是.d.ts结尾的文件,我们主要的代码都是写在以.ts文件结尾的文件中。而.d.ts结尾的文件就是声明文件。声明文件的作用是为js 提供类型检查而存在的。
泛型约束
在 TypeScript 中,可以对泛型进行约束,使得泛型只能接受某些类型或者符合某些条件的类型。这样可以增强泛型的灵活性和安全性。泛型约束有两种形式:类型约束和属性约束。
类型约束是指使用 extends 关键字来约束泛型的类型。
属性约束是指使用类型参数中的属性来约束其他属性。