åtkomstmodifierare - Tilldelning av Typescript-konstruktörsparametrar


Jag har ett gränssnitt:

export interface IFieldValue {
    name: string;
    value: string;
}

Och jag har en klass som implementerar den:

class Person implements IFieldValue{
    name: string;
    value: string;
    constructor (name: string, value: string) {
        this.name = name;
        this.value = value;
    }
}

efter att ha läst detta inlägg har jag funderat på att omstrukturera:

class Person implements IFieldValue{
    constructor(public name: string, public value: string) {
    }
}

Fråga: I första klassen har jag fält som som standard borde vara private. I det andra exemplet kan jag bara sätta dem som public. Är allt korrekt i min förståelse av standardåtkomstmodifierare i TypeScript?

Svar #1

Offentlig som standard. TypeScript-dokumentation

I följande definition

class Person implements IFieldValue{
    name: string;
    value: string;
    constructor (name: string, value: string) {
        this.name = name;
        this.value = value;
    }
}

Attributen <Person>.name och <Person>.value är offentliga som standard.

som de är här

class Person implements IFieldValue{
    constructor(public name: string, public value: string) {
        this.name = name;
        this.value = value;
    }
}

Varning: Här är ett felaktigt sätt att göra det på, eftersom this.name och this.value kommer att betraktas som odefinierade i konstruktorn.

class Person implements IFieldValue{
    constructor(name: string, value: string) {
        this.name = name;
        this.value = value;
    }
}

För att göra dessa attribut privata behöver du skriva om det som

class Person implements IFieldValue{
    private name: string;
    private value: string;
    constructor (name: string, value: string) {
        this.name = name;
        this.value = value;
    }
}

eller ekvivalent

class Person implements IFieldValue{
    constructor (private name: string, private value: string) {}
}

För TypeScript 2.X eftersom gränssnittet har egenskaperna som offentliga, behöver du ändra private till public och även export klasserna

export class Person implements IFieldValue{
    constructor (public name: string, public value: string) {}
}

vilket enligt min åsikt är det mest föredragna sättet som undviker överflöd.

Relaterade artiklar