gpt4 book ai didi

javascript - 流型。创建实现带有可选字段的接口(interface)的类的实例

转载 作者:行者123 更新时间:2023-11-30 20:58:20 25 4
gpt4 key购买 nike

举个例子

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
}
}

看起来很丑。难道flow不能自动解决这样的事情吗?

最佳答案

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

如果 n 未知,而您想要指定该类可以有任意数量的字符串字段,您可以考虑使用映射:

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

请记住,使用这种格式,界面无法规定这些键的确切名称。

关于你的第二个问题,你对 B 类的实现......

class B implements A {
var1: string
}

...如果您尝试在您的问题中使用构造函数,将会导致错误。当您在接口(interface)上定义 var2?: string; 时,您告诉流“一个实现类可能var2,如果有,它必须是一个字符串。”但是当您定义类 B 时,通过不列出 var2,Flow 假定 B 永远不会有 var2。接口(interface)类型确实不能帮助您缩短代码,它只能帮助您确保您的类符合特定的规则集。

在构造函数中,如果你想缩短你的例子,你可以这样做:

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

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

关于javascript - 流型。创建实现带有可选字段的接口(interface)的类的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47404842/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com