引用复杂数据元素

时间:2018-08-16 22:26:40

标签: javascript angular typescript

我有一个由类表示的模型。

例如汽车的型号:

export class Car
{
    public name : string;
    public color: string;
    public power : number;
    public service : boolean;
}

汽车存储在列表中。

cars : Array <Car>;

现在我想拥有一个可以更改汽车属性的函数。

例如第一辆车的颜色或第二辆车的名称。

引用汽车及其属性作为该函数的参数的最佳方法是什么?

据我所知

 cars [0].name 

将传递值而不是函数内部的引用。

我可以通过数组的索引指向汽车。对于属性,我可以采用需要解释的字符串。但是我认为那不是很聪明。

还有更好的主意吗?

1 个答案:

答案 0 :(得分:2)

Advanced Types进行抢救(特别是索引类型)!您可以通过类型安全的方式修改动态属性:

interface Car {
    name: string;
    color: string;
    power: number;
    service: boolean;
}

class CarContainer {
    public cars: Car[] = [];

    updateCar<K extends keyof Car, V extends Car[K]>(index: number, key: K, value: V) {
        let selectedCar = this.cars[index];
        if (selectedCar) {
            selectedCar[key] = value;
        } 
    }
}


let c = new CarContainer();
c.cars.push({
    name: "Old Jalopy",
    color: "black",
    power: 0,
    service: false,
});

// Time for a power upgrade!
c.updateCar(0, "name", "Tesla Roadster");
c.updateCar(0, "power", 100000000);