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

问题描述:

在TypeScript中,const关键字不能用于声明类属性。这样做会导致编译器出错,“一个类成员不能有'const'关键字。”如何在打字稿中实现类常量?

我发现自己需要在代码中明确指出不应更改属性。我希望IDE或编译器在声明后尝试为属性分配新值时发生错误。你们如何实现这一目标?

我目前使用的只读属性,但我是新来的打字稿(和JavaScript),并想知道是否有更好的办法:

get MY_CONSTANT():number {return 10}; 

我使用打字稿1.8。建议?

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

打字稿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://*.com/a/22993349 – cbros2008

+0

问题。难道你为什么需要类名来在类内使用readOnly属性? 'MyClass.myReadonlyProperty' –

常量可以申报类之外,你的类中使用。否则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的大写字母。不建议使用常量大写。 –

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

弃用您可以在声明标志与readonly修改属性:

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

@see TypeScript Deep Dive book - Readonly

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