Hvordan konvertere et objekt til en annen type og fjerne unødvendige felter i TypeScript?
Anta at jeg har følgende kode:
interface A {
a: number;
}
interface B extends A {
b: number;
}
const b: B = {a: 1, b: 5};
const a: A = b as A;
Nå har variabelen a typen A, men den inneholder fortsatt b inni seg. Noen ganger er det uønsket - jeg vil gjerne være sikker på at hvis jeg har en variabel av typen A, så har den de eksakte feltene av typen A. Jeg lurte på om TypeScript har en slags «hard cast» som ville fjernet unødvendige felter når man konverterer mellom typer.
Svar #1
Det finnes ingen typekonvertering i TypeScript fordi det er ikke slik TypeScript fungerer. TS er et typelager på toppen av JS. Når du tilordner en type i TS, setter du ikke en type, du kommenterer at det gitte uttrykket er av en bestemt type. Når TS-koden transpileres til JS, fjernes all typeinformasjon.
Eller med andre ord: typesystemet er JS, med TS kunngjør du bare at en variabel er av en bestemt type. Som oftest skjer det at du tildeler feil type ved design, og blir overrasket under feilsøkingen over at variabelen har en helt annen type enn forventet.
Hvis du vil være sikker på at en egenskap fjernes fra et objekt, må du gå den JS-veis (og - om nødvendig - annotere resultatet med TS). Sjekk denne spørsmål-og-svar for å se hvordan du fjerner egenskaper fra et objekt.
Svar #2
Typescript vil ikke gjøre dette for deg, fordi det ikke er hans jobb.
interface A {
a: number;
}
interface B extends A {
b: number;
}
const b: B = {a: 1, b: 5};
const a: A = b as A; // you want to remove a.b
Bruke ellipsen
const {a, ...otherProperties} = b; // extract the property `a` and keep the other properties in `otherProperties`
Eller bare slett "a", men unngå å slette, det er imperativt og TS vil ikke forstå det, det er også tregere å håndtere slettede egenskaper for vm
delete a.b;
Eller ved å bruke lodash, kan du velge egenskapene du vil ha
const a = _.pick(b, ["a"]); // pick only a
Eller utelate en egenskap mens du fortsatt bruker lodash
const a = _.pick(b, ["b"]); // omit b
Eksempel
