这是一个例子
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
}
}
看起来很难看。流量无法自动解决这些问题吗?
答案 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将无法正确确保您是传递适当的东西。