【问题标题】:Reuse flow class declaration for class definition为类定义重用流类声明
【发布时间】:2017-05-30 11:35:57
【问题描述】:

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

declare type A {
 a: string;
}

class A extends EventEmitter {

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

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

【问题讨论】:

  • 您使用declare type 声明的A 与您使用class A 定义的A 不同。听起来你正在寻找的是一个基类,但你不能这样做,因为你不想总是扩展EventEmitter
  • 如何为我的 A 类声明一个类型?
  • 自动为你的A类创建一个类型,你不能声明它。

标签: javascript class flowtype


【解决方案1】:

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

首先,在您的代码中有两个称为A 的东西,它们是重叠的。让我们重命名它们,以便我们可以适当地谈论它们:

type T {
  a: string;
}

这里,T 是任何具有名为 a 的属性的 Javascript 对象,该属性是一个字符串。

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

C 是您的类的名称,但也是 Flow 已经创建了一个同名的类型,它是所有作为 C 实例或 @ 子类的对象的类型987654331@。 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

您最初的问题是关于避免属性重复。 Flow 没有提供额外的快捷方式来定义classes,但它确实提供了定义类型的快捷方式,通过mixins。但是,我认为它不会完全符合您的要求。您将能够执行以下操作:

declare class SharedProps {
    a: number;
}
declare class A mixins SharedProps {
    b: string;
}

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

【讨论】:

  • 谢谢@peterhall 我已经理解了这个概念。我认为这表明班级支持非常罕见。我目前的情况迫使我为每个班级管理一个额外的类型。我希望其他人也能将其视为表演终结者。
  • 我在流存储库github.com/facebook/flow/issues/3211创建了一个问题
猜你喜欢
  • 1970-01-01
  • 2013-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多