重用类定义的流类声明

时间:2017-01-15 15:15:19

标签: javascript class flowtype

如果没有复制粘贴类定义的所有成员,我如何在这种情况下重用我的类声明?

declare type A {
 a: string;
}

class A extends EventEmitter {

 foo() {
  this.a // error property not found
 }
}

我认为流会认识到class A是type A的一个实例,但它没有。

1 个答案:

答案 0 :(得分:4)

我认为你误解了type在Flow中的含义。

首先,在您的代码中有两个名为A的东西,它们是重叠的。让我们重命名它们,这样我们就可以正确地谈论它们了:

type T {
  a: string;
}

此处,T是任何具有名为a的属性的Javascript对象,是一个数字。

class C extends EventEmitter {
  foo() {
    this.a // error property not found
  }
}

C是您的类的名称,但也是 Flow已经创建了一个相同名称的类型,它是CC实例的所有对象的类型C的子类。 a没有T属性,因此错误是预期的。您无法将其变为T,因为不是T 。将其设为a: number的唯一方法是为其提供class C extends EventEmitter { a: number; foo() { this.a } } 属性:

C

现在T的任何实例也是T,因为它符合const t: T = new C(); // this is now ok 的界面:

classes

您最初的问题是避免重复属性。 Flow并未提供用于定义declare class SharedProps { a: number; } declare class A mixins SharedProps { b: string; } 的其他快捷方式,但它确实提供了通过mixins定义类型的快捷方式。但是,我不认为它会完全符合您的要求。您将能够执行以下操作:

position_stack

但是,这只会声明 types ,而不是实现。你仍然需要在某个地方实现这些类,这可能不会为你节省太多的精力。