摸鱼偷学TS:类、函数浅聊一下 作为一名时间管理大师,在摸鱼的时候顺便学习一手TS的类... 类 传统的面向对象语言基本
浅聊一下
作为一名时间管理大师,在摸鱼的时候顺便学习一手TS的类...
在金三银四的尾巴上了车,如果你也和我一样也想在大三找一份还不错的实习,欢迎掘友们私聊我交流面经(wechat: LongLBond)
类
传统的面向对象语言基本都是基于类的,虽然在ES6以后,JavaScript
也拥有了class
关键字,但是其本质依旧是构造函数,而在TypeScript
中真正有了类
抽象类
抽象类做为其它派生类的基类使用,它们一般不会直接被实例化,不同于接口,抽象类可以包含成员的实现细节。abstract
关键字是用于定义抽象类和在抽象类内部定义抽象方法
举个例子:
abstract class Animal {
abstract makeSound(): void;
move(): void {
console.log('动物移动');
}
}
class Cat extends Animal {
makeSound(): void {
console.log('喵喵叫');
}
}
const cat = new Cat()
cat.makeSound()
cat.move()
定义了一个抽象类Animal
,Cat
继承Animal
,并且重写了makeSound
方法
为什么需要抽象类
在学习抽象类的时候,我在想为什么我们需要抽象类,我让Animal
成为一个普通类不是也能让Cat
继承并且使用他的方法吗?就像下面这样
class Animal {
makeSound(): void{
console.log('动物叫');
};
move(): void {
console.log('动物移动');
}
}
class Cat extends Animal {
makeSound(): void {
console.log('喵喵叫');
};
}
我发现,如果我没有重写makeSound
方法,那么当cat调用makeSound
方法时,打印的是动物叫
,但是很明显,我们想要喵喵叫
,这就体现出抽象类的重要性了
只有抽象类中才可以定义抽象方法,而抽象类中定义的抽象方法在所有继承这个类的类中都必须重写,并且由于抽象类不能实例化的问题,很贴合有些类不能实例化的场景,例如Animal
,我们不会去实例化一个Animal
类,但是会实例化继承Animal
的Cat
类Dog
类等等...
访问限定符
传统面向对象语言通常都有访问限定符,TypeScript
中有三类访问限定符,分别是: public
、private
、protected
。
- public
在 TypeScript
的类中,成员都默认为 public
, 被此限定符修饰的成员是可以被外部访问
class Car {
public run() {
console.log("小米酥妻启动...");
}
}
let car = new Car();
car.run();
- private
当成员被设置为 private
之后, 被此限定符修饰的成员是只可以被类的内部访问
class Car {
public run() {
console.log("小米酥妻启动...");
}
private stop() {
console.log("小米酥妻停止...");
}
}
let car = new Car();
car.run();
car.stop();
此时报错
- protected
当成员被设置为 protected
之后, 被此限定符修饰的成员是只可以被类的内部以及类的子类访问
也就是说被 protected
修饰的属性或者方法只能在类的内部或者子类的内部使用
class Car {
public run() {
console.log("小米酥妻启动...");
}
private stop() {
console.log("小米酥妻停止...");
}
protected addSpeed() {
console.log("小米酥妻加速...");
}
add(){
this.addSpeed();
}
}
class Bmw extends Car {
run() {
console.log("宝马启动...");
super.run();
}
add(){
this.addSpeed();
}
}
函数
函数是 JavaScript
应用程序的基础,它帮助你实现抽象层、模拟类、信息隐藏和模块。
在 TypeScript
里,虽然已经支持类、命名空间和模块,但函数仍然是主要的定义行为的地方,TypeScript
为 JavaScript
函数添加了额外的功能,让我们可以更容易地使用。
定义函数类型
在定义函数的时候,务必要确认函数的参数类型
const add = (a:number, b:number) => a + b
函数的参数
可选参数
一个函数的某个参数可以传也可以不传,如何来处理?
const add = (a:number, b?:number) => a + (b? b: 0)
在参数后面拼接上?来处理
默认参数
当我们需要一个默认参数时(例如计算圆的面积)
const add = (a:number, b = 3.14) => b*a*a
剩余参数
剩余参数与JavaScript
中的语法类似,需要用 ...
来表示剩余参数,而剩余参数 rest
则是一个由number
组成的数组,在本函数中用 reduce
进行了累加求和
const add = (a: number, ...b: number[]) => b.reduce((acc, val) => acc + val, a);
// 正确调用 add 函数,展开数组为单独的参数
console.log(add(1, ...[1, 2, 3])); // 输出 7
结尾
摸完鱼该去吃饭了...
转载自:https://juejin.cn/post/7371687296599605299