目录
类型缩小
我们可以通过类似于 typeof padding === “number” 的判断语句,来改变TypeScript的执行路径;
在给定的执行路径中,我们可以缩小比声明时更小的类型,这个过程称之为 缩小
常见的类型保护有如下几种:
typeof
平等缩小(比如= = =、= =、!= = 、switch)
instanceof
in(如果指定的属性在指定的对象或其原型链中,返回true;)
等等…
函数类型
下面(num1: number, num2: number) => void,代表的就是一个函数类型:
接收两个参数的函数:num1和num2,并且都是number类型;
并且这个函数是没有返回值的,所以是void;
在某些语言中,可能参数名称num1和num2是可以省略,但是TypeScript是不可以的:
参数可选
我们可以指定某个参数是可选的,但是可选类型必须在必传参数的后面
默认参数
这个时候y的类型其实是 undefined 和 number 类型的联合
剩余参数
剩余参数语法允许我们将一个不定数量的参数放到一个数组中
this相关
面试this指路链接
可推导的this类型
TypeScript认为函数 sayHello 有一个对应的this的外部对象 info,所以在使用时,就会把this当做该对象。
不确定的this类型
下面代码运行会报错的:
TypeScript进行类型检测的目的是让我们的代码更加的安全,所以这里对于 sayHello 的调用来说,我们虽然将其放到了info中,通过info去调用,this依然是指向info对象的;
但是对于TypeScript编译器来说,这个代码是非常不安全的,因为我们也有可能直接调用函数,或者通过别的对象来调用函数:
指定this的类型
这个时候,通常TypeScript会要求我们明确的指定this的类型:
函数的重载
函数的重载:函数的名称相同,但是参数不同(个数或者类型)的几个函数,就是函数的重载。
ts里如果我们编写了一个add函数,希望可以对字符串和数字类型进行相加,下面会报错:
解决:
我们可以去编写不同的重载签名来表示函数可以以不同的方式进行调用;
函数的实现体是写在声明下面的,由上而下执行
函数的重截中,实现函数是不能直被调用的
联合类型和重载
有一个需求:定义一个函数,可以传入字符串或者数组,获取它们的长度。
这里有两种实现方案:
方案一:使用联合类型来实现;
方案二:实现函数重载来实现;
当然这种返回值类型确定的,尽量选择使用联合类型来实现
类
在早期的JavaScript开发中(ES5)我们需要通过函数和原型链来实现类和继承,从ES6开始,引入了class关键字,可以更加方便的定义和使用类。
TypeScript作为JavaScript的超集,也是支持使用class关键字的,并且还可以对类的属性和方法等进行静态类型检测
类的定义 class
类的继承extends
我们使用extends关键字来实现继承,子类中使用super来访问父类。
Student类继承自Person:
Student类可以有自己的属性和方法,并且会继承Person的属性和方法;
在构造函数中,我们可以通过super来调用父类的构造方法,对父类中的属性进行初始化;
只要在子类中我们使用了constructor,那么我们就要在子类中写 super,哪怕父类没写构造器
子类如果有和父类相同的方法则会重写
多态
看上去是相同的类型,实际表现出来是不一样的
多态的目的是为了写出更加具备通用性的代码
类的成员修饰符
在TypeScript中,类的属性和方法支持三种修饰符: public、private、protected
public 修饰的是在任何地方可见、公有的属性或方法,默认编写的属性就是public的;
private 修饰的是仅在当前类中可见、私有的属性或方法;
protected 修饰的是仅在类自身及子类中可见、受保护的属性或方法;
public是默认的修饰符,也是可以直接访问的,我们这里来演示一下protected和private。
protected:
子类可以通过this访问到
privite
取值可以用到getters/setters
只读属性readonly
如果有一个属性我们不希望外界可以任意的修改,只希望确定值后直接使用,那么可以使用readonly
只读属性是可以在构造器中赋值,但赋值后就不可修改
返回器getters/setters
在前面一些私有属性我们是不能直接访问的,或者某些属性我们想要监听它的获取(getter)和设置(setter)的过程,
这个时候我们可以使用存取器。
const p= new Person("me")
p.name ="myname"
console.log(p.name)
静态成员 static
前面我们在类中定义的成员和方法都属于对象级别的(new出来访问), 在开发中, 我们有时候也需要定义类级别的成员和方法。
通过类名直接访问:
抽象类abstract
继承是多态使用的前提。
所以在定义很多通用的调用接口时, 我们通常会让调用者传入父类,通过多态来实现更加灵活的调用方式。
但是,父类本身可能并不需要对某些方法进行具体的实现,所以父类中定义的方法,我们可以定义为抽象方法。
什么是 抽象方法? 在TypeScript中没有具体实现的方法(没有方法体),就是抽象方法。(默认函数必须有实现体)
抽象方法,必须存在于抽象类中;
抽象类是使用abstract声明的类;
抽象类有如下的特点:
抽象类是不能被实例化的(也就是不能通过new创建)
抽象方法必须被子类实现,否则报错。(或者把该子类也写成一个抽象类)
类的类型
类本身也是可以作为一种数据类型,上面也可以看出…
TS学习笔记(完结)
指路 TS学习笔记(完结)~