javascript - Typescript: Hur tar man en delmängd av attribut från ett objekt?
Exempel :
type t = {
a1: boolean;
a2: number;
a3: string;
};
const o1 = {
a1: true,
a2: 1,
a3: 'blah',
a4: false,
a5: 'blah blah'
}
const o2: t = o1 as t; // this doesn't work as I expected
Hur ställer man in o2 dynamiskt så att det endast tar o1:s attribut som passar typ t?
Det vill säga, behåll de attribut som passar och kassera resten. I detta fall med ett resultat som motsvarar
const o2: t = {
a1: o1.a1,
a2: o1.a2,
a3: o1.a3
}
utom att det görs dynamiskt eftersom t kan ändras.
Svar #1
Jag tror inte att TypeScript har något inbyggt som låter dig göra detta. Det skulle kräva en form av reflektion, vilket i sin tur skulle kräva att TypeScript genererar en lista över t:s medlemmar till JavaScript som det producerar, vilket det normalt sett inte gör. Jag har inte hittat något i TypeScript-dokumentationen om reflektion (vilket var förvånande).
Som en tillfällig lösning kan du lista medlemmarna i en array. Detta är en duplicering, men verkar vara en oundviklig duplicering:
type t = {
a1: boolean;
a2: number;
a3: string;
};
const t_members = ["a1", "a2", "a3"];
då är det en enkel loop:
const o2: t = {} as t;
for (const member of t_members) {
o2[member] = o1[member];
}
Om detta är något du gör ofta, skapa en hjälpfunktion för det.
Svar #2
Såvitt jag kan se håller Const o2 på att bli ett slags objekt istället för typ t, så det tar alla egenskaper som du tilldelar.
här kan du göra en sak, `
class t {
a1: boolean;
a2: number;
a3: string;
constructor(a:any) {
this.a1 = a.a1;
this.a2 = a.a2;
this.a3 = a.a3;
}
};
type c={
a1: boolean,
a2: number,
a3: string,
a4: false,
a5: string
}
const o1:c = {
a1: true,
a2: 1,
a3: 'blah',
a4: false,
a5: 'blah blah'
}
let o2: t = new t(o1);
`
detta kan hjälpa.
