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" ;
    }
}

Relaterte artikler