Bootstrap

typescript里的 InstanceType

在TypeScript中,InstanceType 是一个内置的工具类型,用于获取一个类的实例类型。下面是一个简单的例子:

class MyClass {
  x = 0;
  y = 0;
}

type Instance = InstanceType<typeof MyClass>; // MyClass的实例类型

let instance: Instance = new MyClass(); // 这是正确的
instance.x = 10; // 这也是正确的

在上面的例子中,Instance 类型等于 MyClass 类的实例类型,所以你可以创建一个新的 MyClass 实例并将其赋值给一个 Instance 类型的变量。

InstanceType 主要用在一些高级场景,例如你想要创建一个工厂函数,该函数接受一个类作为参数,然后返回一个该类的新实例:

function create<T extends new (...args: any[]) => any>(C: T): InstanceType<T> {
  return new C();
}

let instance = create(MyClass);

在这个例子中,create 函数可以接受任何类,然后返回一个该类的新实例。InstanceType<T> 就用来获取 C 的实例类型。

在这个例子中用于创建一个泛型函数 create。这个函数接收一个类型参数 T,然后返回这个类型的实例。这里的 T extends new (...args: any[]) => any 是对 T 的约束,意思是 T 必须是一个可以用 new 运算符构造的类型。

详细解释如下:

  • T extends new (...args: any[]) => any 这一部分定义了 T 的约束。T 必须是一个类(或者说是可被 new 构造的类型),其构造函数可以接收任意数量和类型的参数(...args: any[]),并且构造函数的返回值可以是任何类型(=> any)。

  • new (...args: any[]) => any 这部分是 TypeScript 中的构造签名,表示一个可以用 new 运算符调用的函数,其参数为任意类型的数组,返回值也是任意类型。

  • InstanceType<T> 是 TypeScript 的内置工具类型,用于获取某个构造函数类型的实例类型。例如,如果 T 是 { new(): Foo },那么 InstanceType<T> 就是 Foo

所以,整体上,这个 create 函数的作用是接收一个类作为参数,然后创建并返回这个类的一个新实例。

;