2016-05-17 28 views
159

在TypeScript中,const關鍵字不能用於聲明類屬性。這樣做會導致編譯器出錯,「一個類成員不能有'const'關鍵字。」如何在打字稿中實現類常量?

我發現自己需要在代碼中明確指出不應更改屬性。我希望IDE或編譯器在聲明後嘗試爲屬性分配新值時發生錯誤。你們如何實現這一目標?

我目前使用的只讀屬性,但我是新來的打字稿(和JavaScript),並想知道是否有更好的辦法:

get MY_CONSTANT():number {return 10}; 

我使用打字稿1.8。建議?

PS:現在我使用的打字稿2.0.3,所以我接受了大衛的回答

回答

242

打字稿2.0有readonly modifier

class MyClass { 
    readonly myReadonlyProperty = 1; 

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

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

這不完全是一個常數,因爲它允許在構造函數中分配,但是這是最簡單的選擇。

替代解決方案

另一種方法是使用static關鍵字與readonly

class MyClass { 
    static readonly myReadonlyProperty = 1; 

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

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

MyClass.myReadonlyProperty = 5; // error, readonly 

這是在構造函數沒有被分配,只在一個地方現有的利益。

+0

所以你不需要一個const或任何正確的? – Jackie

+6

要從類外部訪問屬性,需要在'readonly'關鍵字之前的'class'和'public static'之前添加'export'關鍵字。看到這裏:http://stackoverflow.com/a/22993349 – cbros2008

+0

問題。難道你爲什麼需要類名來在類內使用readOnly屬性? 'MyClass.myReadonlyProperty' –

31

常量可以申報類之外,你的類中使用。否則get屬性是一個很好的解決辦法

const MY_CONSTANT: string = "wazzup"; 

export class MyClass { 

    public myFunction() { 

     alert(MY_CONSTANT); 
    } 
} 
+4

謝謝;我很擔心這個實現,因爲它不是可移植的(在模型中,常量實際上不是類的一部分),它將信息泄漏到更大的範圍,但它有一個真正的常量的優點,不用提高警鐘就能改變它。 – BeetleJuice

+1

我理解這個問題,我發現在你的情況下使用get屬性非常合適 – j3ff

+3

根據https://angular.io/docs/ts/latest/guide/style-guide.html請使用camel caase的大寫字母。不建議使用常量大寫。 –

7

Angular 2提供了一個非常好的功能,稱爲不透明常量。 創建一個類&使用不透明常量定義所有常量。

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/"  
}; 

注入它的供應商在 app.module.ts

您將能夠跨越每一個組件都使用它。

編輯角4:

角形4的新概念是注射令牌&不透明令牌在角4棄用。

注射令牌添加上不透明令牌的頂部的功能,它允許連接上經由打字稿泛型,加註射令牌的令牌類型信息,移除添加@Inject

示例代碼

角2的需要採用不透明令牌

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 
    ] 
    } 
] 

角4個使用注射令牌

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! 
    ] 
    } 
] 

注射令牌上的不透明令牌的頂部設計合理&不透明令牌在角4

+5

加一。 Angular和13歲的青少年一樣穩定。他們在獲得功能後幾個月就棄用了。小氣。 – Stavm

+0

減1。這個問題與Angular無關。它正在請求TypeScript解決方案。 – Ben

6

棄用您可以在聲明標誌與readonly修改屬性:

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

@see TypeScript Deep Dive book - Readonly

0

要麼使用readOnly修飾符與常量需要聲明,要麼可以在類之外聲明一個常量,並只使用get運算符在所需的類中使用它。