2016-05-17 21 views
159

In TypeScript, la parola chiave const non può essere utilizzata per dichiarare le proprietà della classe. In questo modo il compilatore commette un errore con "Un membro della classe non può avere la parola chiave 'const'".Come implementare le costanti di classe in dattiloscritto?

Mi trovo nel bisogno di indicare chiaramente nel codice che una proprietà non deve essere modificata. Voglio che l'IDE o il compilatore di errore se tento di assegnare un nuovo valore alla proprietà una volta che è stato dichiarato. Come raggiungete questo ragazzi?

Attualmente sto usando una proprietà di sola lettura, ma io sono nuovo a Carattere tipografico (e JavaScript) e mi chiedo se ci sia un modo migliore:

get MY_CONSTANT():number {return 10}; 

sto usando dattiloscritto 1.8. Suggerimenti?

PS: Ora sto utilizzando dattiloscritto 2.0.3, così ho accettato la risposta di David

risposta

242

dattiloscritto 2.0 ha il readonly modifier:

class MyClass { 
    readonly myReadonlyProperty = 1; 

    myMethod() { 
     console.log(this.myReadonlyProperty); 
    } 
} 

new MyClass().myReadonlyProperty = 5; // error, readonly 

Non è esattamente una costante perché permette l'assegnazione nel costruttore, ma questa è l'opzione più semplice.

soluzione alternativa

Un'alternativa è quella di utilizzare la parola chiave static con readonly:

class MyClass { 
    static readonly myReadonlyProperty = 1; 

    constructor() { 
     MyClass.myReadonlyProperty = 5; // error, readonly 
    } 

    myMethod() { 
     console.log(MyClass.myReadonlyProperty); 
    } 
} 

MyClass.myReadonlyProperty = 5; // error, readonly 

Questo ha il vantaggio di non essere assegnabili nel costruttore e solo esistente in un unico luogo.

+0

Quindi non hai bisogno di un const o di qualcosa di corretto? – Jackie

+6

Per accedere alle proprietà dall'esterno della classe, è necessario aggiungere la parola chiave 'export' prima di' class' e 'public static' prima della parola chiave' readonly'. Vedi qui: http://stackoverflow.com/a/22993349 – cbros2008

+0

Domanda. Era senza motivo perché è necessario il nome della classe per utilizzare quella proprietà readOnly all'interno della classe stessa? 'MyClass.myReadonlyProperty' –

31

costanti possono essere dichiarano di fuori delle classi e utilizzano all'interno della vostra classe. In caso contrario, la proprietà get è una bella soluzione

const MY_CONSTANT: string = "wazzup"; 

export class MyClass { 

    public myFunction() { 

     alert(MY_CONSTANT); 
    } 
} 
+4

Grazie; Sono preoccupato per questa implementazione perché non è portabile (nel modello, la costante non fa parte della classe) e trasmette informazioni in un ambito più ampio, ma ha il vantaggio di essere una costante reale, quindi ho vinto " essere in grado di cambiarlo senza alzare i campanelli d'allarme. – BeetleJuice

+1

Capisco la preoccupazione e trovo l'uso della proprietà '' get'' molto appropriato nel tuo caso – j3ff

+3

Per https://angular.io/docs/ts/latest/guide/style-guide.html per favore usa invece il cammello caase di maiuscole. La maiuscola per le costanti non è raccomandata. –

7

Angolare 2 Fornisce una funzionalità molto piacevole denominata Costanti opache. Creare una classe & Definire tutte le costanti presenti utilizzando le costanti opache.

import { OpaqueToken } from "@angular/core"; 

export let APP_CONFIG = new OpaqueToken("my.config"); 

export interface MyAppConfig { 
    apiEndpoint: string; 
} 

export const AppConfig: MyAppConfig = {  
    apiEndpoint: "http://localhost:8080/api/"  
}; 

iniettarlo in fornitori in app.module.ts

Sarete in grado di usarlo attraverso ogni componenti.

EDIT per angolare 4:

Per angolare 4 il nuovo concetto è Iniezione Token & gettone opaco è deprecato in angolare 4.

iniezione Token Aggiunge funzionalità in cima opaco Gettoni, permette di collegare tipo di informazioni sul token tramite farmaci generici tipografico, più gettoni per iniezione, elimina la necessità di aggiungere codice @Inject

Esempio

angolare 2 utilizzando opache Gettoni

const API_URL = new OpaqueToken('apiUrl'); //no Type Check 


providers: [ 
    { 
    provide: DataService, 
    useFactory: (http, apiUrl) => { 
     // create data service 
    }, 
    deps: [ 
     Http, 
     new Inject(API_URL) //notice the new Inject 
    ] 
    } 
] 

angolare 4 Utilizzo di token iniezione

const API_URL = new InjectionToken<string>('apiUrl'); // generic defines return value of injector 


providers: [ 
    { 
    provide: DataService, 
    useFactory: (http, apiUrl) => { 
     // create data service 
    }, 
    deps: [ 
     Http, 
     API_URL // no `new Inject()` needed! 
    ] 
    } 
] 

gettoni iniezione sono progettati logicamente in cima gettoni opachi & gettoni opache sono obsoleti in angolare 4.

+5

più uno. Angolare è stabile come un adolescente di 13 anni. ottengono caratteristiche deprecate alcuni mesi dopo averli rilasciati. meschino. – Stavm

+0

meno uno. Questa domanda non ha nulla a che fare con Angular. Richiede una soluzione TypeScript. – Ben

6

È possibile contrassegnare gli oggetti con readonly modificatore nella dichiarazione:

export class MyClass { 
    public static readonly MY_PUBLIC_CONSTANT = 10; 
    private static readonly myPrivateConstant = 5; 
} 

@see TypeScript Deep Dive book - Readonly

0

O utilizzare il modificatore readOnly con il costante che deve dichiarare o si potrebbe dichiarare una costante al di fuori della classe e usarlo specificatamente solo nella classe richiesta utilizzando l'operatore get.

Problemi correlati