javascript - 重用流类声明进行类定义

标签 javascript class flowtype

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

declare type A {
 a: string;
}

class A extends EventEmitter {

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

我以为 Flow 会识别出 class A 是 type A 的实例,但事实并非如此。

最佳答案

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

首先,在您的代码中有两个名为 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 的接口(interface):

const t: T = new C(); // this is now ok

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

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

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

关于javascript - 重用流类声明进行类定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41662696/

相关文章:

javascript - jQuery:如何选择包含两个字符串的类

python - 从字符串中获取类对象

javascript - 路径与路由匹配,但未呈现该路由的组件

c++ - 执行一次类代码 C++

JavaScript 类似模板的语句

javascript - ES6 模块 : How to automatically re-export all types in the current directory from index. js?

javascript - Vim 错误格式多行字符串

javascript - jquery .click 看不到 .append() 代码

javascript - 禁用按钮,直到选择 AJAX 生成的单选按钮

javascript - 在Python中使用Selenium单击特定按钮并启动for循环