2014-10-03 13 views
7

Abbiamo un getter tipica in uno dei nostri corsi, consente di direFirma dell'interfaccia TypeScript per proprietà senza setter.

class Employee implements IEmployee { 
    private _fullName: string; 

    get fullName(): string { 
     return this._fullName; 
    } 
} 

e un'interfaccia per lavorare con esso

interface IEmployee{ 
    fullName: string; 
} 

Quando si lavora con un'istanza tramite questa interfaccia il compilatore non avvertirci sull'assenza di un setter se proviamo ad assegnare a fullName, e il runtime di JS semplicemente inghiotte qualsiasi incarico e non genera un errore. C'è un modo per contrassegnare un membro dell'interfaccia come se avesse solo getter o solo setter?

Ho visto this post, ma è piuttosto vecchio, voglio sapere, se qualcosa è migliorato.

+0

Davvero sorpreso dalla mancanza di attività per questa domanda. Le proprietà di sola lettura sono incredibilmente utili e uno dei primi modelli che ho provato ad implementare in TypeScript. – gravidThoughts

risposta

1

Questa è una domanda interessante. Il concetto di una proprietà readonly è sottilmente differente in TypeScript in altre lingue.

In molte lingue una proprietà con un getter (ma senza setter) genera un errore del compilatore se si tenta di impostare la proprietà, ma TypeScript no.

La proprietà è ancora in sola lettura, perché non fa alcuna differenza se si tenta di impostarla; l'insieme fallirà silenziosamente.

Ecco un esempio, senza alcuna interfaccia:

class Example { 
    get name() { 
     return 'Steve'; 
    } 
} 

var y = new Example(); 
y.name = 'Example 2'; 
alert(y.name); 

Non v'è alcun avviso del compilatore quando uso x.name = 'Example 2';.

Se era un avvertimento del compilatore, successivamente mi aspetto che ci sia un modo per specificare la capacità di sola lettura di una proprietà all'interno di un'interfaccia. Come ci si aspetterebbe, date le informazioni di cui sopra, non è possibile impostare una proprietà readonly su un'interfaccia.

interface Test { 
    name: string; 
} 

class Example { 
    get name() { 
     return 'Steve'; 
    } 
} 

var x: Test = new Example(); 
x.name = 'Example 1'; 
alert(x.name); 

var y = new Example(); 
x.name = 'Example 2'; 
alert(x.name); 

Questo significa che si può applicare solo in sola lettura-ness di avere un metodo per ottenere il valore della proprietà (e, ovviamente, nessun metodo che gli permette di essere impostata).

interface Test { 
    getName:() => string; 
} 

class Example { 
    getName() { 
     return 'Steve'; 
    } 
} 

var x: Test = new Example(); 
//x.getName('Obviously not'); 
//x.getName() = 'Obviously not'; 
alert(x.getName()); 

var y = new Example(); 
//y.getName('Obviously not'); 
//y.getName() = 'Obviously not'; 
alert(y.getName()); 
+0

Readonlyness è praticamente applicato già dal comportamento di JS in assenza di un setter. Il problema è la sua natura silenziosa - ingoiare tranquillamente il valore. La soluzione ideale (e auspicabilmente in arrivo) consentirebbe ai membri dell'interfaccia TS di essere contrassegnati come aventi solo getter \ setter. Un'alternativa sarebbe che il transpiler generasse un setter getter vuoto in assenza di esso, il che farebbe semplicemente un errore (almeno per un setter questo è il comportamento previsto dal nostro intero team). La soluzione tediosa finale sarebbe quella di fare sempre un incantatore di lancio a mano se non è necessario un setter effettivo. –

+0

'Readonlyness è già applicato dal comportamento di JS in assenza di un setter. Sì - anche se per" forzato ", stavo parlando più di un avvertimento del compilatore, di linee rosse ondulate e di qualche tipo di allarme acustico. Il codice di esempio mostra lo scarto silenzioso del tentativo impostato. Nel frattempo, l'utilizzo di un metodo per l'accesso alle proprietà è l'unico modo per ottenere il tempo di compilazione che garantisce che non venga tentato alcun tentativo. – Fenton

+0

Creato un problema su GitHub a proposito di questo problema https://github.com/Microsoft/TypeScript/issues/814 –