I Typescript, hvorfor må jeg sette egenskapen til en klasse som er definert som skrivebeskyttet?
Jeg har følgende klasse-definisjon:
class Department
{
name: string;
id: string;
get prefix(): string
{
return !isNaN(parseFloat(this.id)) ? "n" : "i" ;
}
}
Andre steder i koden min prøver jeg å bruke den slik:
getDepartmentList(): Department[] {
return [
{
"name": "Dept 1",
"id": "1000"
}
];
}
Jeg får imidlertid følgende feil:
Type '{ "name": string; "id": string; }' kan ikke tildeles typen 'Department'. Egenskapen 'prefix' mangler i typen '{ "name": string; "id": string; }'.
Jeg er sikker på at det virkelige problemet er min mangel på forståelse av Typescript, men kan noen forklare hvorfor kompilatoren ser getter-funksjonen som en egenskap og forventer at jeg setter en verdi på den?
Svar #1
Klassen din Department oppretter en type Department. Du definerer at den skal inneholde name, id og prefix. Objektene du returnerer i getDepartmentList inneholder ikke prefix, så de er ikke strukturelt kompatible med typen Department. Derfor får du en feil.
Jeg antar at du antar at prefix-egenskapen vil være tilgjengelig på alt som erklæres å være av typen Department. Dette er ikke tilfelle, det finnes ingen form for dynamiske klasseoppgaver som det i TypeScript. Du må selv sørge for at objekter som du sier har en bestemt type, faktisk oppfyller den typen.
Du kan gjøre det på en måte som dette:
class Department
{
constructor(public name:string, public id:string){ }
get prefix(): string
{
return !isNaN(parseFloat(this.id)) ? "n" : "i" ;
}
}
function getDepartmentList(): Department[]
{
return [new Department("Dept 1", "1000")];
}
Her oppretter du nye objekter fra Department-klassen, derfor vil alle disse objektene ha prefix-egenskapen.
Bruken av tilgangsmodifikatoren i konstruktorsignaturen forteller TypeScript å opprette en egenskap av den parameteren, i stedet for at den bare behandles som et argument.
Det tilsvarer:
class Department
{
name: string;
id:string;
constructor(name:string, id:string){
this.name = name;
this.id = id;
}
get prefix(): string
{
return !isNaN(parseFloat(this.id)) ? "n" : "i" ;
}
}
