TypeScript学习五:class

108 阅读1分钟

类修饰符

  • public: 公共
  • protected: 受保护的(只有自身与子类可以使用)
  • private: 私有
class Parent {
  public name: string;
  protected num: number;
  private age: number;
  constructor(name: string, age: number, num: number) {
    this.name = name;
    this.age = age;
    this.num = num;
  }
  public getAge() {
    console.log(this.age);
  }
  protected getName() {
    return this.name;
  }
}
class Child extends Parent {
  public readonly aaa: string;
  constructor(name: string, age: number, num: number, aaa: string) {
    super(name, age, num);
    this.aaa = aaa;
    console.log(this.age);   // err: 属性“age”为私有属性,只能在类“Parent”中访问
    console.log(this.num);
    console.log(super.getName()); // 通过 "super" 关键字只能访问基类的公共方法和受保护方法
  }
}
const c1 = new Child("name", 20, 123, "aa");
c1.aaa = "123eqw";     // err: 只读不能修改
console.log(c1);

abstract

  1. 抽象类:不能创建实例,只能被类继承
  2. 抽象方法

抽象类/方法只需要定义 : 属性名/方法名/方法参数/返回值类型,不可添加实际代码块

abstract class C3 {
  constructor(public name: string) {}
  public abstract getName(): void;
}
// 类不会创建抽象类中的抽象成员,必须手动实现
class P3 extends C3 {
  constructor(public name: string) {
    super(name);
  }
  public getName() {
    console.log(this.name);
  }
}

接口继承类

接口继承类,但不会继承类的实现

class C6 {
  protected name: string;
  constructor(name: string) {
    this.name = name;
  }
}
interface I2 extends C6 {
  age: number;
}

// 扩展:
// 因为name是受保护属性,C7没有继承C6,所以不是子类,此时需要获取name,则需要继承C6
class C7 extends C6 implements I2 {
  public name: string;
  public age: number;
  constructor(name: string, age: number) {
    super(name);
    this.name = name;
    this.age = age;
  }
}

泛型中使用类类型

const creatNew = <T>(c: new () => T): T => {
  return new c();
};
class C8 {
  public name: string;
  constructor() {
    this.name = "nameStr";
  }
}
console.log(creatNew<C8>(C8));