【TypeScript】class面向对象&类型兼容&交叉类型

发布于:2023-01-04 ⋅ 阅读:(277) ⋅ 点赞:(0)

目录

一、Class 类:

1.构造函数:

2.类的实例方法:

二、class 类之间的继承和 interface接口实现:

1.类之间的继承关系:

2.接口和类之间的实现关系:

三、类成员可见性:

readonly 只读修饰符:

四、类型兼容性:

1.类之间的类型兼容:

2.接口、函数之间的类型兼容:

五、交叉类型:


        TS中的高级类型:class类型,类型兼容性,交叉类型,泛型,keyof,索引签名类型,索引查询类型,映射类型。


一、Class 类:

        TypeScript全面支持ES2015中引入的class关键字,并为其添加了类型注解和其他语法。class基本使用:

// class类型
class Person {}

// 创建class类型实例:
const p = new Person()
  • 根据TS中类型推论,可以知道Person类的实例对象p的类型是Person。
  • TS中的class,不仅提供了class的语法功能,也作为一种类型存在。

1.构造函数:

        成员初始化后,才可以通过this.属性名来访问实例成员。需要为构造函数指定类型注解,否则会被隐式推断为any,构造函数不需要返回值类型。

class Person{
    name: string
    age: number
    
    // 构造函数:
    constructor(name: string, age: number) {
        this.name = name
        this.age = age
    }
}

2.类的实例方法:

        定义在类中的方法(函数),通过类的实例进行调用。

class Person{
    name: string
    age: number

    // 构造函数:
    constructor(name: string, age: number) {
        this.name = name
        this.age = age
    }

    // 实例方法:
    showInfo(): void{
        console.log("名称:" + this.name + "\t年龄:" + this.age)
    }
}

二、class 类之间的继承和 interface接口实现:

1.类之间的继承关系:

        通过extends关键字实现类之间的继承关系:

// 类之间的继承:
class Person{
    showInfo(): void{
        console.log("我是一个人!!!")
    }
}

// 子类继承父类:
class Student extends Person{
    name: string
    age: number
}

// 实例化子类:
const stu = new Student()
// 通过子类实例调用父类方法:
stu.showInfo()

2.接口和类之间的实现关系:

        通过implements关键字可以让一个类实现一个接口:

// 定义的接口:
interface FlyAble{
    fly(): void
}

// 创建一个类实现接口:
class bird implements FlyAble{
    fly() {
        console.log("flying !!!")
    }
}

三、类成员可见性:

        类成员可见性,可以使用TS的权限修饰符:public(公共的),protected(受保护的),private(私有的)。

  • public:表示公开的,公有的成员可以被任何地方访问,默认可见性。因为public是默认可见性,可以直接省略。
class Person{
    public name: string
    
    public showInfo(): void{
        console.log(this.name)
    }
}
  • protected:表示受保护的,仅对其声明所在的类和子类中(非实例对象)可见。子类的方法内部可以通过this来访问父类中受保护的成员,但是对实例不可见。
  • private:表示私有的,只在当前类中可见,对实例对象以及子类也是不可见的。

readonly 只读修饰符:

        readonly:表示只读,用来防止在构造函数之外对属性进行赋值。

class Person{
    // readonly表示只读修饰符,只能通过构造函数进行初始化:
    readonly name: string

    // 初始化只读属性:
    constructor(name: string) {
        this.name = name
    }

    public showInfo(): void{
        console.log(this.name)
    }
}
  • 使用readonly修饰符,表示该属性只能读不能进行值的修改,注意该修饰符只能修饰属性不能修饰方法
  • 注意:接口或者 {} 表示的对象类型的成员属性也可以使用readonly修饰。

四、类型兼容性:

        两种类型系统:Structural Type System(结构化类型系统),Nominal Type Syetem(表明类型系统)。

        TS采用的就是结构化类型系统,也叫做duck typing(鸭子系统),类型检查关注的是值所具有的形状。也就是说,在结构类型系统中,如果两个对象具有相同的形状,则认为他们是同一个类型。

1.类之间的类型兼容:

2.接口、函数之间的类型兼容:

 


五、交叉类型:

        交叉类型(&):功能类似于接口继承(extends),用于组合多个类型为一个类型(常用于对象类型)。

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到