流动型。创建实现具有可选字段的接口的类实例

时间:2017-11-21 03:46:03

标签: javascript flowtype

这是一个例子

interface A {
  var1: string;
  var2?: string;
}

class B implements A {
   var1: string
}

const bInstance = new B({ var1: "sss" }) // no such constructor

Flow让我将var1声明为类属性。那么,如果我有n个字段呢?我应该重写所有这些还是有另一种方法来解决它?

Flow不会让我将var2声明为类属性,因为它是可选的。我应该手动创建B构造函数

constructor (a: any) {
  this.var1 = a.var1
  if (a.var2) {
    this.var2 = a.var2
  }
}

看起来很难看。流量无法自动解决这些问题吗?

1 个答案:

答案 0 :(得分:0)

如果您有一个已知n个字段,是的,您需要列出所有字段的类型。否则,Flow将如何理解允许的属性集?

如果n未知,而您想要指定该类可以包含任意数量的字符串字段,则可以考虑使用地图:

interface A {
  someName: { [key: string]: string };
}

请记住,使用此格式时,界面无法指示这些键的确切名称。

关于你的第二个问题,你实施了B类......

class B implements A {
   var1: string
}
如果您尝试在问题中使用构造函数,

...将导致错误。当您在界面上定义var2?: string;时,您告诉流“实现类可能var2,如果是,则它必须是字符串。”但是当你定义了B类时,不列出var2,Flow假设B永远不会有var2。接口类型确实无法帮助您缩短代码,它只会帮助您确保您的类符合特定的规则集。

在构造函数中,如果要缩短示例,可以执行以下操作:

constructor (a: any) {
  Object.assign(this, a); // copy all properties of `a` to `this`
}

无论如何,我强烈建议您将构造函数中a的类型更改为更具体的内容(或者甚至只删除“: any”),否则Flow将无法正确确保您是传递适当的东西。