typescript - En egenskap som er skrivebeskyttet utenfor klassen, men kan leses og skrives av klassemedlemmer


Jeg ønsker å ha en egenskap i klassen min som kan leses, men ikke endres direkte av kode utenfor klassen. I praksis tilsvarende det å returnere en konstant referanse til et medlem fra en metode i C++.

Skriver noe i den retningen:

class test {
    private readonly x_ = new Uint8Array([0, 1, 2]);
    public x() { return this.x_;}
}

fungerer ikke, fordi kode som følgende fortsatt kompileres:

let a = new test();
a.x()[0] = 1;

Hva er den riktige måten å oppnå dette på?

Svar #1

For fremtidige lesere, vi kan bruke getter for å tillate lesing av egenskap utenfor klassen, men begrense redigering.

class Test {
    private x_ = new Uint8Array([0, 1, 2]);

    get x() {
        return this.x_;
    }
}
let test = new Test();
console.log(test.x) //Can read
test.x = 1; //Error: Cannot assign to 'x' because it is a read-only property.

Svar #2

Du kan gjøre noe sånt:

interface ReadonlyTypedArray<T> {
    readonly [index: number]: T
}

class test {
    private _x = new Uint8Array([0, 1, 2]);
    public get x(): ReadonlyTypedArray<number> {
        return this._x;
    }
}

let a = new test();
a.x[0] = 1; // Error: Left-hand side of assignment expression cannot be a constant or a read-only property.
a.x = new Uint8Array([0, 1, 2]); // Error: Left-hand side of assignment expression cannot be a constant or a read-only property.

Relaterte artikler