如何在打字稿中实现类常量?

在TypeScript中, const关键字不能用来声明类属性。 这样做会导致编译器出错,“一个类成员不能有'const'关键字。

我发现自己需要在代码中清楚地指出一个属性不应该改变。 我想要IDE或编译器错误,如果我试图分配一个新的值的属性一旦声明。 你们怎么做到的?

我目前正在使用一个只读属性,但我是新手Typescript(和JavaScript),并想知道是否有更好的方法:

 get MY_CONSTANT():number {return 10}; 

我正在使用打字稿1.8。 build议?

PS:我现在使用的是打字稿2.0.3,所以我接受了David的回答

TypeScript 2.0具有readonly修饰符 :

 class MyClass { readonly myReadonlyProperty = 1; myMethod() { console.log(this.myReadonlyProperty); } } new MyClass().myReadonlyProperty = 5; // error, readonly 

它不完全是一个常量,因为它允许在构造函数中赋值,但这是最简单的选项。

替代scheme

另一种方法是只使用static关键字:

 class MyClass { static readonly myReadonlyProperty = 1; constructor() { MyClass.myReadonlyProperty = 5; // error, readonly } myMethod() { console.log(MyClass.myReadonlyProperty); } } MyClass.myReadonlyProperty = 5; // error, readonly 

这样做的好处是不能在构造函数中赋值,只能在一个地方存在。

常量可以在类之外声明并在类中使用。 否则get属性是一个很好的解决方法

 const MY_CONSTANT: string = "wazzup"; export class MyClass { public myFunction() { alert(MY_CONSTANT); } } 

Angular 2提供了一个非常好的function,称为不透明常量。 创build一个类&使用不透明常量定义所有的常量。

 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中的提供者中

您将能够在每个组件中使用它。

编辑angular4:

对于Angular 4来说,新的概念是注入令牌和不透明令牌在angular色4中被弃用。

注入令牌在不透明令牌上添加function,它允许通过TypeScriptgenerics附加令牌上的types信息,加上注入令牌,不需要添加@Inject

示例代码

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

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

注入令牌在逻辑上devise在不透明令牌之上&不透明令牌在Angular 4中被弃用。

您可以在声明中使用readonly修饰符标记属性:

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

请参阅TypeScript深潜书 – 只读

使用readOnly修饰符与常量需要声明或者可以在类之外声明一个常量,并使用get运算符只在所需的类中使用它。