如何解决这个“构造函数不能在对象类型上调用”错误的流程?
我很难找出流量抱怨的问题。我试图通过存储实现类来允许实现一个API,然后再实例化它,但是,当我呼叫new this.implKlass
说“构造函数不能在对象类型上调用”时,流程投诉。试图告诉我什么是流程,以及我在概念上缺少流程的工作原理?如何解决这个“构造函数不能在对象类型上调用”错误的流程?
实施例下面的代码,和flow try code这里
/* @flow */ type ApiT = {
fnA(): Promise<*>;
}
// An implementation of the API
class Impl {
async fnA(): Promise<*> { return 1; }
}
class DoThings {
implKlass: ApiT;
constructor(klass) {
this.implKlass = klass;
}
callA() {
const Klass = this.implKlass;
const inst = new Klass();
return inst.fnA();
}
}
new DoThings(Impl).callA();
输出示例:
18: const inst = new Klass(); ^constructor call. Constructor cannot be called on
18: const inst = new Klass();
^object type
13: constructor(klass: ApiT) {
^property `fnA`. Property not found in
23: new DoThings(Impl).callA();
^statics of Impl
回答:
有了一个小的修改工作的。
class DoThings { implKlass: Class<ApiT>;
constructor(klass) {
this.implKlass = klass;
}
callA() {
const Klass = this.implKlass;
const inst = new Klass();
return inst.fnA();
}
}
的错误是你写ApiT
而不是Class<ApiT>
。 ApiT
将是类的一个实例,而Class<ApiT>
是类本身。
Try flow link
回答:
ApiT
描述了一个对象类型,而不是一个类类型。 Impl
类的一个实例满足ApiT
类型,但类Impl
本身不符合。例如,您不能拨打Impl.fnA()
。
我不确定是否有任何方法传递这样的构造函数。然而,你可以通过使用一个工厂函数基本上完成同样的事情:
type ApiT = { fnA(): Promise<*>;
}
type ApiTFactory =() => ApiT;
class Impl {
async fnA(): Promise<*> { return 1; }
}
class DoThings {
factory: ApiTFactory;
constructor(factory: ApiTFactory) {
this.factory = factory;
}
callA() {
const factory = this.factory;
const inst = factory();
return inst.fnA();
}
}
new DoThings(() => new Impl()).callA();
tryflow link
以上是 如何解决这个“构造函数不能在对象类型上调用”错误的流程? 的全部内容, 来源链接: utcz.com/qa/260192.html