TypeScript/TS入门学习1

85 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情

抽象类

定义

  1. 抽象类作为其他派生类的基类使用,他们不会被直接实例化
  2. 抽象类是专门用于定义哪些不希望外界直接创建的类的
  3. 抽象类和接口一样用于约束子类

抽象类和接口的区别

  1. 抽象类必须包含 astract 关键字并且可以包含访问修饰符
  2. 接口中只能定义约束,不能定义具体实现,而抽象类中既可以定义约束,又可以定义具体实现


export default {}

abstract class Person {
    abstract name: string;
    abstract show(): string;
    showName() {
        console.log(this.show())
    }
}

class Student extends Person {
    name: string = '骚帮';
    show(): string {
        return `可恶的人${this.name}`;
    }
    // @2 自定义方法
    showName(): void {
        console.log('善良的骚帮')
    }
}
// @1直接报错
let p = new Person();
let s = new Student();
console.log(s.show())

@1处 证明了 abstract 类不能直接用来创建实例 @2处 可以覆写父类的方法,如果不覆写,就可以直接用父类的方法。

implements 关键字

定义

实现,类可以实现一个或多个接口,使用关键字impolements

注意

实现一个带有可选属性的接口,并不能创建该属性,除非,类里面明确定义了该属性,否则会报错 只要一个接口继承了某个类,那么继承这个类所有的属性和方法,不会继承属性和方法的实现。

与extends的区别

extends 继承某个类,继承之后可以使用父类方法和属性。 implements 实现某个类,必须重写才能使用


export default {}

interface IPersonInfo {
    name: string;
    age: number;
    sex?: string;
    show(): void;
}

class Person implements IPersonInfo {
    name: string = 'tom';
    age: number = 12;
    // @1
    // sex: string = "男";
    show(): void {
        console.log(`${this.name}是我们最爱的人,今年${this.age}岁`)
    }
}
let p = new Person();
// @2
p.sex = '女'
p.show()

如果@1处注释了 那么后面@2处就报错了,因为这个类根本就没有sex属性,但是如果@1放开,后面就不会报错了。