我有一个带有2个私有属性和一个对象数组的Typescript类。
class AssigningProperties {
private animalType1: string;
private animalType2: string;
animals = [
{
name: "Bob",
type: "cat"
},
{
name: "Max",
type: "dog"
}
];
constructor() {
this.animals.forEach(v => console.log(v.name));
}
}
new AssigningProperties ();
我想将类属性
animalType1
分配给cat
,将animalType2
分配给dog
,最好使用Array.foreach
。我可以使用对象索引来分配它,如下所示:
this.animalType1 = this.animals[0].type;
但我觉得有更好的方法。救命?Link to CodeSandBox
最佳答案
您正在执行的操作很好,但是如果您想循环执行,请将animalTypes
设置为数组:
private animalTypes: string[];
然后,将第二个参数用于
forEach
回调,即条目的索引:this.animals.forEach((v, i) => v.type = this.animalTypes[i]);
或者,如果您想将
"cat"
分配给第一个animalTypes
(这是您的CodeSandbox代码正在执行的操作),则:this.animals.forEach((v, i) => this.animalTypes[i] = v.type);
无论使用哪种方法,最终都会将类型存储在两个地方,这会带来维护风险-您可以在不更新
animals[0].type
/ animalType1
的情况下更新animalTypes[0]
。假设您希望
animals
是事实的一个来源,则可以改用getters:private get animalType1(): string {
return this.animals[0].type;
}
private get animalType2(): string {
return this.animals[1].type;
}
Live Copy on the playground
或者对于
animalTypes
方法,您将使用代理:interface Animal {
name: string;
type: string;
}
class AssigningProperties {
animals: Animal[] = [
{
name: "Bob",
type: "cat"
},
{
name: "Max",
type: "dog"
}
];
private animalTypes = new Proxy<Animal[]>(this.animals, {
get(target, propName) {
if (propName in target) {
return Reflect.get(target, propName).type;
}
return undefined;
}
});
}
Live Copy on the playground
关于arrays - 如何将数组中对象的属性分配给多个类属性?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59562231/