我有一个带有2个私有属性和一个对象数组的打字稿类。
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;
,但我觉得有更好的方法。帮助吗?
答案 0 :(得分:3)
您正在做的事情很好,但是如果您想循环执行,请将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]
。 / p>
假设您希望animals
是真理的一个来源,则可以改用getter:
private get animalType1(): string {
return this.animals[0].type;
}
private get animalType2(): string {
return this.animals[1].type;
}
或者对于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;
}
});
}