ts语法(七)

42 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情

类的继承

  • 面向对象的其中一大特性就是继承,继承不仅仅可以减少我们的代码量,也是多态的使用前提。我们使用extends关键字来实现继承,子类中使用super来访问父类。
  • 我们来看一下Student类继承自Person:Student类可以有自己的属性和方法,并且会继承Person的属性和方法;在构造函数中,我们可以通过super来调用父类的构造方法,对父类中的属性进行初始化;
class Student extends Person {
    num: number

    constructor(name: string, age: number, num: number) {
      super(name, age)
      this.num = num
    }

    fn() {
      console.log(this.name)
    }
}

类的成员修饰符

在TypeScript中,类的属性和方法支持三种修饰符: public、private、protected。public 修饰的是在任何地方可见、公有的属性或方法,默认编写的属性就是public的;private 修饰的是仅在同一类中可见、私有的属性或方法;protected 修饰的是仅在类自身及子类中可见、受保护的属性或方法;

class Person {
    protected name: string

    constructor(name: string) {
      this.name = name
    }
}

class Student extends Person {
    constructor(name: string) {
      super(name)
    }

    fn() {
      console.log(this.name)
    }
}
class Person {
    private name: string

    constructor(name: string) {
      this.name = name
    }
}


const p = new Person("zhangsan")

只读属性readonly

如果有一个属性我们不希望外界可以任意的修改,只希望确定值后直接使用,那么可以使用readonly:

class Person {
    readonly name: string

    constructor(name: string) {
      this.name = name
    }
}

静态成员

在开发中, 我们有时候也需要定义类级别的成员和方法,在TypeScript中可以通过关键字static来定义:

class Person {
    static time: string = "12:00"

    static eat() {
      console.log("吃饭")
    }
}

Person.eat()

抽象类abstract

继承是多态使用的前提。

  • 所以在定义很多通用的调用接口时, 我们通常会让调用者传入父类,通过多态来实现更加灵活的调用方式。但是,父类本身可能并不需要对某些方法进行具体的实现,所以父类中定义的方法,我们可以定义为抽象方法。
  • 什么是 抽象方法? 在TypeScript中没有具体实现的方法,就是抽象方法。抽象方法,必须存在于抽象类中;抽象类是使用abstract声明的类;
  • 抽象类有如下的特点:抽象类是不能被实例的话(也就是不能通过new创建),抽象方法必须被子类实现,否则该类必须是一个抽象类;

类的类型

类本身也是可以作为一种数据类型的:

class Person {
    name: string

    constructor(name: string) {
      this.name = name
    }
    fn() {
      console.log(this.name)
    }
}

const p1: Person = new Person("zhangsan");
const p2: Person = {
    name: "lisi",
    fn: function() {
      console.log(this.name)
    }
}