首页 > 解决方案 > 如何让 TypeScript 推断动态 new() 调用的类型

问题描述

我正在动态创建子类,我希望工厂函数知道子类的返回类型。

我可以用演员表来做,但我想知道是否有办法在不需要演员表的情况下推断它。

class Hello { 
  a = 1;
}

class Hello2 extends Hello{ 
  b = 2; 
}

class Hello3 extends Hello { 
  c = 3; 
}

function create<T extends typeof Hello>(ctor: T): InstanceType<T> {
  // If I don't cast this, it won't compile
  return new ctor() as InstanceType<T>;
}

// Fails as it should because it's not a constructor of the right type
const h1 = create(Number);
const h2 = create(Hello2); 
console.log(h2.b); // no error
const h3 = create(Hello3);
console.log(h3.c); // no error

标签: typescripttype-inference

解决方案


什么,如果你改为使类实例通用(而不是静态侧/构造函数)?这应该适合你,就像这里

class Hello { 
  a = 1;
}

class Hello2 extends Hello{ 
  b = 2; 
}

class Hello3 extends Hello { 
  c = 3; 
}

function create<T extends Hello>(ctor: new() => T) {
  return new ctor()
}

const h1 = create(Number); // error
const h2 = create(Hello2); // h2: Hello2
console.log(h2.b); // no error
const h3 = create(Hello3); // h3: Hello3
console.log(h3.c); // no error

如果需要,您可以定义要传递的附加参数,例如create<T extends Hello>(ctor: new(...args: any[]) => T)或更具体的方式。


推荐阅读