flowtype - 传递泛型类类型/构造函数而不是实例作为参数
问题描述
假设我们有一个包含此类的文件:
class Foo<T> {
bar: T;
constructor(bar: T) {
this.bar = bar;
}
}
function getFooType() {
return Foo;
}
getFooType()
在另一个文件中,传入的返回值是:
function baz(fooType: ???) {
let foo1 = new fooType<number>(1);
let foo2 = new fooType<string>("2");
}
我无法为我的生活弄清楚应该进入什么???
。
自然的选择是Class<Foo<T>>
,但这会迫使您T
通过做来关闭baz<T>(...)
,而我希望它保持打开状态;你会得到像“不能Foo
用类型参数构造非多态[1]”这样的错误。你在哪里new fooFactory<...>()
所以另一个明显的选择是 using Class<Foo>
,但是你会得到错误“Cannot use Foo
[1] without 1 type argument”。在那个参数上。
事实上,如果它有一个泛型类型说明符,它看起来不可能传递一个类的类型。那正确吗?如果是这样,那就太令人失望了。
解决方案
因此,您只需要以与调用工厂函数相同的方式来描述类型:
function baz(fooType: <T>(bar: T) => Foo<T>) {
let foo1 = new fooType<number>(1);
let foo2 = new fooType<string>("2");
}
笔记:
知道它使用依赖注入机制实际上非常重要,因为这解决了泛型声明的问题。然而<T>
意味着typeof T
等于any
。您应该指定更准确的内容,例如<T: number | string>
.
推荐阅读
- python - 匹配来自两个不同数据帧的列值并配对观察值
- for-loop - 我想根据列表中的值在文件路径中创建空目录文件夹
- angular - NgRx 效果只执行一次
- amazon-web-services - AWS CDK 如何从 OpenApi 规范创建由 Lambda 支持的 API 网关?
- python - 将多行分配到烧瓶中的 json 字典中
- c# - 如何使用 protobuf.net 查找 2 个对象之间的“增量”或“差异”,跟踪已更改
- java - 读取 txt 文件并记录它的页面 - JAVA
- javascript - JS 循环跳到屏幕上绘制的最后一个矩形(使用画布)
- flutter - 为什么 MediaQuery(context).size 会抛出错误?
- c++ - 获取分段错误字符串 s=s+"A";