如何使用函数返回的 Class 作为 TypeScript 中的类型?

How can I use a Class returned by a function as a type in TypeScript?

我正在开发一个小型库,其中包含一个生成 Class 的实用函数。这是因为 Class 具有相当复杂的签名,其中包含大量泛型。它看起来有点像这样:

function generateClass() {
  class GeneratedClass {
    ...
  }
  return GeneratedClass;
}

编译器正确推断出此函数的 return 类型。唯一的问题是,我不能使用 returned 值作为类型。这仅在我扩展 returned GeneratedClass 时有效。有关更详细的示例,请参阅此 TS Playground snippet.

有什么方法可以使 returned class 可用作类型吗?我宁愿不要求我的库的消费者键入 class Something extends generateClass() { ... },因为这违背了实用函数的目的,使创建这些类型 classes.

变得更加方便

您可以通过多种方式获取实例类型:

如果您有 class 的实例,您可以使用 typeof 和该变量来键入参数:

  const FooClass = generateClass();

  const foo = new FooClass(5);
  function processFoo(fooParam: typeof foo) { 

  }

在打字稿 2.8 中,您可以使用条件类型 InstanceType:

const FooClass = generateClass();

const foo = new FooClass(5);
function processFoo(fooParam: InstanceType<typeof FooClass>) { 

}
processFoo(foo);

在 2.8 之前,您可以在不使用辅助函数和虚拟变量实例化的情况下获取实例类型:

const foo = (function<T>(arg: new (...args: any[])=> T) : T{ return null as any})(FooClass);
function processFoo(fooParam: typeof foo) { 

}
processFoo(foo);

在任何一种情况下,您都可以将实例类型存储在 type 别名中以在多个地方使用:

type GeneratedClass = typeof foo;
type GeneratedClass = InstanceType<typeof FooClass>; // for 2.8