Typescript中如何表达一个类是继承至某个类的?

在平时写代码时,我们常常会有这样的写法:

class BaseClass {}
function init(SomeClass) {
  if (isInherited(SomeClass, BaseClass)) {
    ...
  }
}

上面代码中,表示的是,init这个函数的参数,只接收继承自BaseClass的类,那么这种表达,在typescript中如何表示呢?

function init(SomeClass: ???) {
  ...
}

你看,这比较麻烦吧。你可能会想到:

function init(SomeClass: BaseClass): void

但这显然是不对的,这样表达的意思是SomeClass是BaseClass的实例,而不是类。

正确的表达是如下:

function init(SomeClass: new () => BaseClass): void

其中 new() 是 typescript 中的特殊表达形式,表示以该类型作为具体类进行实例化(需要注意,在typescript中,某个class既是类型,也是值)。而 new () => BaseClass 这句话的意思就是实例化之后得到的实例的类型是BaseClass,或者说,实例化之后是BaseClass的实例(由于在typescript中,某个class既是类型,也是值,因此,比较难用纯粹类型语言进行表达)。这样一来,我们就可以表达出“SomeClass是继承至BaseClass”这一要求。