2016-11-17 3 views
2

Ich hätte gerne eine Eigenschaft in meiner Klasse, die lesbar ist, aber nicht direkt durch Code außerhalb der Klasse geändert werden kann. Im Prinzip entspricht dies dem Zurückgeben einer Konst-Referenz auf ein Member aus einer Methode in C++.Eine Eigenschaft, die außerhalb der Klasse schreibgeschützt ist, aber für Klassenmitglieder schreibgeschützt ist

Schreiben etwas in diese Richtung:

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

nicht funktioniert, weil Code wie die folgenden noch kompiliert:

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

Was ist der richtige Weg, um dies zu erreichen?

Antwort

1

Sie so etwas tun:

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. 
+0

Diese fast funktioniert, aber das Problem ist, dass es Typinformationen verliert ... Das heißt, ich kann nicht 'ax' zu' uniformMatrix4fv' passieren, weil die Typoskript-Compiler sieht es als 'ReadonlyTypedArray ' anstelle von 'Float32Array' – nicebyte

+0

@nicebyte Aber ein typisiertes Array' Uint8Array' kann mutiert werden. Wenn eine Funktion einen Parameter vom Typ 'Float32Array' benötigt, kann sie mutieren. – Paleo

Verwandte Themen