javascript - hur man fixar den saknade typen i typescript
DATA = {
data: [
{ id: "1r5WioSdYLVqp", row: 1, assetType: "1r5WioSdYLVqp", status: "" },
{ id: "w1muKlmY4lsR", row: 2, assetType: "w1muKlmY4lsR", status: "" },
{ id: "1foDN2HDHiAbT", row: 3, assetType: "1foDN2HDHiAbT", status: "" }
]
};
new = { row: 1, assetType: "1fKBO4w0XHg7H", status: "ACTIVE" }
constructor() { }
ngOnInit() {
console.log(this.DATA);
this.DATA['data'].forEach((dt, index) => {
if (dt.row === this.new.row) {
this.DATA['data'][index] = this.new;
}
});
console.log(this.DATA)
}
Det jag försöker göra här är att uppdatera datan baserat på radnummer. men på den nya finns det inget ID. men jag får ett fel som är:
Svar #1
Vi kan ange att ett objekt kanske inte har ett id genom att använda en typnotering som visar att det är valfritt.
Först, låt oss deklarera en typ:
interface Item {
id?: string;
row: number;
assetType: string;
status: string;
}
? på id ovan indikerar att det är en valfri egenskap. Den kan anges eller inte anges.
Nu låt oss tillämpa det:
DATA: { data: Item[] } = {
data: [
{ id: "1r5WioSdYLVqp", row: 1, assetType: "1r5WioSdYLVqp", status: "" },
{ id: "w1muKlmY4lsR", row: 2, assetType: "w1muKlmY4lsR", status: "" },
{ id: "1foDN2HDHiAbT", row: 3, assetType: "1foDN2HDHiAbT", status: "" }
]
};
new = { row: 1, assetType: "1fKBO4w0XHg7H", status: "ACTIVE" }
constructor() { }
ngOnInit() {
console.log(this.DATA);
this.DATA.data.forEach((dt, index) => {
if (dt.row === this.new.row) {
this.DATA.data[index] = this.new; // no error.
}
});
console.log(this.DATA)
}
Observera att jag har smugit in en ytterligare typ, i form av objektliteraltypen { data: Item[] }. Detta gjordes på grund av inbäddningen av koden i frågan. Om DATA bara har en egenskap, data, skulle jag packa upp den för att förenkla saker.
Då skulle du kunna skriva
data: Item[] = [
{ id: "1r5WioSdYLVqp", row: 1, assetType: "1r5WioSdYLVqp", status: "" },
{ id: "w1muKlmY4lsR", row: 2, assetType: "w1muKlmY4lsR", status: "" },
{ id: "1foDN2HDHiAbT", row: 3, assetType: "1foDN2HDHiAbT", status: "" }
]
Vilket är lättare att läsa och skriva. Alternativt kan vi deklarera en typ för det yttre objektet
interface DataWrapper {
data: Item[];
}
DATA: DataWrapper = {
data: [
{ id: "1r5WioSdYLVqp", row: 1, assetType: "1r5WioSdYLVqp", status: "" },
{ id: "w1muKlmY4lsR", row: 2, assetType: "w1muKlmY4lsR", status: "" },
{ id: "1foDN2HDHiAbT", row: 3, assetType: "1foDN2HDHiAbT", status: "" }
]
}
Slutligen, och utan samband, kan vi rensa upp den här koden lite genom att ta bort den onödiga forEach.
const index = this.DATA.data.findIndex(({row}) => row === this.new.row);
if (index !== -1) {
this.DATA.data[index] = this.new;
}
Svar #2
sätt null på en egenskap id av variabeln new.
new = { id: null, row: 1, assetType: "1fKBO4w0XHg7H", status: "ACTIVE" }
