如何在打字稿中实现类常量?
在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
这是在构造函数没有被分配,只在一个地方现有的利益。
常量可以申报类之外,你的类中使用。否则get
属性是一个很好的解决办法
const MY_CONSTANT: string = "wazzup";
export class MyClass {
public myFunction() {
alert(MY_CONSTANT);
}
}
谢谢;我很担心这个实现,因为它不是可移植的(在模型中,常量实际上不是类的一部分),它将信息泄漏到更大的范围,但它有一个真正的常量的优点,不用提高警钟就能改变它。 – BeetleJuice
我理解这个问题,我发现在你的情况下使用get属性非常合适 – j3ff
根据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
弃用您可以在声明标志与readonly
修改属性:
export class MyClass {
public static readonly MY_PUBLIC_CONSTANT = 10;
private static readonly myPrivateConstant = 5;
}
要么使用readOnly修饰符与常量需要声明,要么可以在类之外声明一个常量,并只使用get运算符在所需的类中使用它。
所以你不需要一个const或任何正确的? – Jackie
要从类外部访问属性,需要在'readonly'关键字之前的'class'和'public static'之前添加'export'关键字。看到这里:http://*.com/a/22993349 – cbros2008
问题。难道你为什么需要类名来在类内使用readOnly属性? 'MyClass.myReadonlyProperty' –