问题基本上是如何确保对以典型 JavaScript 方式实现的高阶组件进行类型检查。
Hoc1 = (superclass) => class extends superclass { ... }
class A { ... }
class B extends Hoc1(A) { ... }
通过类型检查,我的意思是使用两个最突出的实用程序中的任何一个:TypeScript或flow。
到目前为止,我已经在 TypeScript 中提出了以下代码段,
interface IAMixin {
aMixedMethod(): void
}
interface IAMixinConstructor {
new(): IAMixin
}
const AHoc: <T>(superclass: T) => T & IAMixinConstructor = (superclass) =>
class extends superclass implements IAMixin {
aMixedMethod() {}
}
class A {
aMethod() {}
}
class B extends AHoc(A) {
bMethod() {}
}
const b = new B();
b.aMixedMethod(); // false-positive: incrorrectly reports as missing method
b.aMethod();
b.bMethod();
b.cMethod(); // this is correctly caught, though
如果我这样写mixin
const AMixin: (superclass) => typeof superclass & IAMixinConstructor =
(superclass) => class extends superclass implements IAMixin {
aMixedMethod() {}
}
然后它认为superclass
asany
并且错误地错过了调用的错误cMethod
。
这似乎至少在 TypeScript 中是可能的,因为它们例如可以Object.assign
正确地为instance工作。但是我需要相同类型的构造,但是对于classes。
还是我们需要像Ruby 类这样的类类型?