我有一个带有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/

10-12 00:37
查看更多