Skip to content

抽象类和成员

TypeScript中的类、方法和字段可以是抽象的。

一个抽象的方法或抽象的字段是一个没有提供实现的方法或字段。这些成员必须存在于一个抽象类中,不能直接实例化。

抽象类的作用是作为子类的基类,实现所有的抽象成员。当一个类没有任何抽象成员时,我们就说它是具体的。

让我们看一个例子:

typescript
abstract class Base { 
  abstract getName(): string; 
  printName() { 
    console.log("Hello, " + this.getName()); 
  } 
}
const b = new Base();

我们不能用 new 来实例化 Base ,因为它是抽象的。相反,我们需要创建一个派生类并实现抽象成员。

typescript
class Derived extends Base { 
  getName() { 
    return "world"; 
  } 
}
const d = new Derived(); 
d.printName();
  • 抽象构造签名

有时你想接受一些类的构造函数,产生一个从某些抽象类派生出来的类的实例。

例如,你可能想写这样的代码:

typescript
function greet(ctor: typeof Base) { 
  const instance = new ctor(); 
  instance.printName(); 
}

TypeScript正确地告诉你,你正试图实例化一个抽象类。毕竟,鉴于greet的定义,写这段代码是完全合法的,它最终会构造一个抽象类。

typescript
// 槽糕 
greet(Base);

相反,你想写一个函数,接受具有结构化签名的东西:

typescript
function greet(ctor: new() => Base) { 
  const instance = new ctor(); 
  instance.printName(); 
}
greet(Derived); 
greet(Base);

现在TypeScript正确地告诉你哪些类的构造函数可以被调用: Derived 可以,因为它是具体的,但 Base 不能。