javascript - Typescript: sette en egenskap til å være en bestemt type
Jeg er veldig ny på Typescript, og utforsker bare hvordan vi kan konvertere vår eksisterende JS-kode. Min tilnærming (som godt kan være feil) er å gjøre det minimale for å få det til å fungere i TypeScript, og deretter gradvis konvertere det for å følge «beste praksis».
Jeg ser ut til å ha falt ved første hinder.....
Jeg har følgende TypeScript, som bruker jQuery (i en ASP.NET .NET5-applikasjon).
interface MyInterface {
prop1: string;
prop2: number;
}
const something = {
currentThing : MyInterface,
init: (): void => {
//
}
};
$(something.init);
Så ideen er at når siden lastes, vil something.init bli kjørt. Dette vil sette opp ting som hendelseshåndterere via jQuery-selektorer, osv. osv. Den delen ser ut til å fungere helt fint.
Men...
På et tidspunkt vil en hendelsesbehandler utløses, og jeg vil opprette et nytt objekt som vil implementere MyInterface. Jeg må bevare det (ved å sette det som verdien av egenskapen/feltet currentThing) slik at det deretter kan aksesseres av fremtidige hendelser.
Imidlertid liker ikke Typescript linjen currentActivity: MyInterface, og jeg får feilen:
'MyInterface' refererer bare til en type, men brukes her som en verdi.
Svar #1
Et objekt følger nøkkel-verdi-strukturen, Typescript forstår den nåværende objektdefinisjonen som
const something = {
// key value
currentThing : MyInterface,
};
og siden MyInterface ikke er en gyldig verdi, vil det kaste den nevnte feilen.
Det du bør gjøre i dette tilfellet er å definere typer for something-objektet, og angi typer for dets egenskaper slik som følgende:
interface MyInterface {
prop1: string;
prop2: number;
}
interface SomethingInterface {
currentThing : MyInterface;
init: () => void
}
const currentThing = { prop1: 'aStringValue', prop2: 12345 };
const something: SomethingInterface = {
currentThing,
init: (): void => {
//
}
};
$(something.init);
Svar #2
Jeg anbefaler at du skriver inn ditt something-objekt ved å bruke et nytt grensesnitt, slik som:
interface MyInterface {
prop1: string;
prop2: number;
}
interface Something {
currentThing: MyInterface;
init: () => void;
}
const something: Something = {
currentThing: {
prop1: 'foo',
prop2: 5,
},
init: (): void => {
//
},
};
console.log(something.init);
