typescript - 如何让 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
解决方案
什么,如果你改为使类实例通用(而不是静态侧/构造函数)?这应该适合你,就像这里:
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)
或更具体的方式。
推荐阅读
- prometheus - 将字符串附加到grafana查询中的变量?
- c# - 鼠标与孩子一起留在面板上
- hive - -- 不支持配置单元导入的增量 lastmodified 选项
- sql-server - 如何根据 SQL Server 2017 中的最后日期创建一行
- java - 我可以在不使用本机查询的情况下在 JPA 中创建此查询吗?
- reactjs - 如何避免使用useRef在react中重新渲染?
- c# - 用户登录 Office365 时 Excel 互操作不再工作
- mobile - 移动地理定位到地铁
- mysql - 当对 utf8mb4 数据和子字符串 ü 有索引时,MySql 和 MariaDB 中的错误?
- powershell-core - Powershell(pwsh)不接受命令行参数?