typescript - 带有通用参数的 TypeScript InstanceType
问题描述
我正在构建一个库,它允许消费者为其提供构造函数/类,其实例将构成其公共成员之一。
对于一个简单的非泛型类,这可以正常工作,并且我们可以在库实例的公共接口上获得准确推断的智能感知和类型安全性:
class MyLibrary<TNewable extends new (...args: any[]) => any> {
public foo: InstanceType<TNewable>;
constructor(ConsumerNewable: TNewable) {
this.foo = new ConsumerNewable();
}
}
class ConsumerProvidedClass {}
const library = new MyLibrary(ConsumerProvidedClass);
library.foo // type: ConsumerProvidedClass
现在考虑这样一个场景,ConsumerProvidedClass
它本身有一个通用参数,它定义了它的行为的某些方面。这对于这个问题并不重要,但实际用例是 RxJSSubject
或者observable 的吞吐量类型BehaviorSubject
在哪里。TThroughput
因此,例如:
class ConsumerProvidedClass<TThroughput> { ... }
该库现在已扩展为允许使用者提供类型的“初始值”,该类型TModel
将ConsumerProvidedClass
在实例化时传递给它,并且也成为其吞吐量类型:
class MyLibrary<TNewable extends new (...args: any[]) => any, TModel> {
public foo: InstanceType<TNewable>;
constructor(ConsumerNewable: TNewable, initialValue: TModel) {
this.foo = new ConsumerNewable(initialValue);
}
}
class ConsumerProvidedClass<TThroughput> {}
class ConsumerProvidedModel {}
const library = new MyLibrary(ConsumerProvidedClass, new ConsumerProvidedModel());
library.foo // type: ConsumerProvidedClass<{}>
问题是属性上的智能感知.foo
正确推断ConsumerProvidedClass
但不知道其通用吞吐量类型,并回退到<{}>
.
我想看到的是:
library.foo // type: ConsumerProvidedClass<ConsumerProvidedModel>
TModel
但这将依赖于能够InstanceType<TNewable>
作为通用参数提供。我无法找到有关如何执行此操作的任何信息,或者是否确实有可能。理想情况下,我想做这样的事情:
public foo: (InstanceType<TNewable>)<TModel>;
但不幸的是,这不是有效的 TypeScript。
当然,我可以让消费者在实例化库时显式传递所有泛型类型,但我更希望一切都在可能的情况下进行推断,以获得更好的开发人员体验。
任何见解都非常感谢。也许还有另一种我想念的方法来解决这个问题。
解决方案
推荐阅读
- php - 未捕获的错误:在 null 中调用成员函数 query()
- php - PHP多文件上传只会上传前10个选择的文件(尝试更改max_file_uploads)主机说它是我的代码?
- firebase - 如何使用事件范围的自定义维度和指标报告
- pandas - Pandas:将日期时间列与另一个数据框连接(性能)
- node.js - 如果使用 knex 不存在,如何忽略列更新?
- c - c语言中链表中的分段错误
- python - (DataFrame - Groupby) 如何匹配行?
- javascript - 如何使用 ev.target.nextElementSibling ev.targetprevElementSibling 转到下一个/上一个图像灯箱?
- flutter - Flutter DataTable 排序图标未显示
- c++ - 指向 byte[] 的指针指向 std::unique_ptr
不编译