Javascript 对复杂数据元素的引用

Javascript 对复杂数据元素的引用,javascript,angular,typescript,Javascript,Angular,Typescript,我有一个由类表示的模型 e、 g.汽车模型: export class Car { public name : string; public color: string; public power : number; public service : boolean; } 汽车存储在一个列表中 cars : Array <Car>; 将传递值,而不是函数中的引用 我可以通过数组的索引指向一辆车。对于属性,我可以使用需要解释的字符串。但我认为这不太明

我有一个由类表示的模型

e、 g.汽车模型:

export class Car
{
    public name : string;
    public color: string;
    public power : number;
    public service : boolean;
}
汽车存储在一个列表中

cars : Array <Car>;
将传递值,而不是函数中的引用

我可以通过数组的索引指向一辆车。对于属性,我可以使用需要解释的字符串。但我认为这不太明智

有更好的主意吗?

来拯救(特别是索引类型)!可以以类型安全的方式修改动态属性:

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);
接口车{
名称:字符串;
颜色:字符串;
功率:数字;
服务:布尔;
}
类集装箱{
公共汽车:汽车[]=[];
updateCar(索引:number,键:K,值:V){
让selectedCar=this.cars[index];
如果(所选车辆){
selectedCar[键]=值;
} 
}
}
设c=新的CarContainer();
c、 汽车。推({
名称:“老老爷车”,
颜色:“黑色”,
功率:0,
服务:假,
});
//是时候升级电源了!
c、 updateCar(0,“名称”,“特斯拉跑车”);
c、 updateCar(0,“功率”,100000000);
拯救(特别是索引类型)!可以以类型安全的方式修改动态属性:

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);
接口车{
名称:字符串;
颜色:字符串;
功率:数字;
服务:布尔;
}
类集装箱{
公共汽车:汽车[]=[];
updateCar(索引:number,键:K,值:V){
让selectedCar=this.cars[index];
如果(所选车辆){
selectedCar[键]=值;
} 
}
}
设c=新的CarContainer();
c、 汽车。推({
名称:“老老爷车”,
颜色:“黑色”,
功率:0,
服务:假,
});
//是时候升级电源了!
c、 updateCar(0,“名称”,“特斯拉跑车”);
c、 updateCar(0,“功率”,100000000);

如果您的汽车对象没有任何功能,请使用接口而不是类。使用javascript数组
cars:Car[]
。然后,您将能够简单地
cars[0]。name=…
这是一个非常广泛的问题。这真的取决于你想做什么。我唯一的建议是阅读JavaScript中的不可变对象,以及变异对象的更改检测问题。如果您的Car对象没有任何函数,则使用接口而不是类。使用javascript数组
cars:Car[]
。然后,您将能够简单地
cars[0]。name=…
这是一个非常广泛的问题。这真的取决于你想做什么。我唯一的建议是阅读JavaScript中的不可变对象,以及变异对象的变化检测问题。