TypeScript_3_typescript类与接口的使用
TypeScript类的使用
认识类的使用
- 在早期的JavaScript开发中(ES5)我们需要通过函数和原型链来实现类和继承,从ES6开始,引入了class关键字,可以更加方便的定义和使用类。
- TypeScript作为JavaScript的超集,也是支持使用class关键字的,并且还可以对类的属性和方法等进行静态类型检测。
- 实际上在JavaScript的开发过程中,我们更加习惯于函数式编程:
- 比如React开发中,目前更多使用的函数组件以及结合Hook的开发模式;
- 比如在Vue3开发中,目前也更加推崇使用CompositionAPI;
- 但是在封装某些业务的时候,类具有更强大封装性,所以我们也需要掌握它们。
- 类的定义我们通常会使用class关键字:
- 在面向对象的世界里,任何事物都可以使用类的结构来描述;
- 类中包含特有的属性和方法;
类的定义
类的继承
类的多态
-
基于继承和接口实现 class Animal {
action() {
console.log("animal action")
}
}
class Dog extends Animal {
action() {
console.log("dog running!!!")
}
}
class Fish extends Animal {
action() {
console.log("fish swimming")
}
}
class Person extends Animal {
}
function makeActions(animals: Animal[]) {
animals.forEach(animal => {
animal.action()
})
}
makeActions([new Dog(), new Fish(), new Person()])
类的成员修饰符
只读属性readonly
getters/setters
- 在前面一些私有属性我们是不能直接访问的,或者某些属性我们想要监听它的获取(getter)和设置(setter)的过程,这个时候我们可以使用存取器。
静态成员
-
前面我们在类中定义的成员和方法都属于对象级别的,在开发中,我们有时候也需要定义类级别的成员和方法。 -
在TypeScript中通过关键字static来定义:
抽象类abstract
- 我们知道,继承是多态使用的前提。
- 所以在定义很多通用的调用接口时,我们通常会让调用者传入父类,通过多态来实现更加灵活的调用方式。
- 但是,父类本身可能并不需要对某些方法进行具体的实现,所以父类中定义的方法,,我们可以定义为抽象方法。
- 什么是抽象方法? 在TypeScript中没有具体实现的方法(没有方法体),就是抽象方法。
- 抽象方法,必须存在于抽象类中;
- 抽象类是使用abstract声明的类;
- 抽象类有如下的特点:
- 抽象类是不能被实例的话(也就是不能通过new创建)
- 抽象方法必须被子类实现,否则该类必须是一个抽象类;
抽象类演练
类的类型
-
类本身也是可以作为一种数据类型的:
TypeScript接口的使用
接口的声明
-
在前面我们通过type可以用来声明一个对象类型: -
对象的另外一种声明方式就是通过接口来声明: -
他们在使用上的区别,我们后续再来说明。 -
接下来我们继续学习一下接口的其他特性。
可选属性
-
接口中我们也可以定义可选属性:
只读属性
索引类型
函数类型
接口继承
接口的实现
交叉类型的应用
interface和type区别
- 我们会发现interface和type都可以用来定义对象类型,那么在开发中定义对象类型时,到底选择哪一个呢?
- 如果是定义非对象类型,通常推荐使用type,比如Direction、Alignment、一些Function;
- 如果是定义对象类型,那么他们是有区别的:
- interface 可以重复的对某个接口来定义属性和方法;
- 而type定义的是别名,别名是不能重复的;
字面量赋值
TypeScript枚举类型
枚举类型的值
|