类修饰符
- 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
- 抽象类:不能创建实例,只能被类继承
- 抽象方法
抽象类/方法只需要定义 : 属性名/方法名/方法参数/返回值类型,不可添加实际代码块
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));