将typeof用作参数类型

时间:2019-06-03 14:27:58

标签: typescript

让我说一堂课

public class A {
  foo: string;
}

如何定义一个函数,使其接受类的类型并返回它的实例?像这样:

function bar<T>(c: typeof T): T {
  return new c();
}

const a: A = bar(A);

2 个答案:

答案 0 :(得分:2)

TypeScript文档实际上包含an example,用于在泛型中使用类类型:

  

使用泛型在TypeScript中创建工厂时,有必要通过其构造函数来引用类类型。例如,

     
function create<T>(c: {new(): T; }): T {
    return new c();
}

new()constructor function

答案 1 :(得分:1)

要完成Daniel的答案:

我们可以使用type Constructor<T = {}> = new (...args: any[]) => T;进行更明确的说明,并为构造函数指定参数(但不进行静态类型检查)。

type Constructor<T = {}> = new (...args: any[]) => T;

function create<T>(Klass: Constructor<T>, ...args: any[]): T {
    return new Klass(...args);
}

class A0 { }
class A1 { constructor(readonly arg: string) {} }

const a0 = create(A0);
console.log(a0 instanceof A0); // true

const a1 = create(A1, 'arg');
console.log(a1 instanceof A1, a1.arg === 'arg'); // true, true

结果→在TS playground上运行它。