在TypeScript中,不能使用const关键字来声明类属性。这样做会导致编译器报错“类成员不能有'const'关键字”。
我发现自己需要在代码中明确指出不应该更改某个属性。我希望IDE或编译器在声明属性后,如果我试图将新值赋给属性时出错。你们是怎么做到的?
我目前正在使用只读属性,但我想知道是否有更好的方法:
get MY_CONSTANT():number {return 10};
我使用的是typescript 1.8。建议吗?
PS:我现在使用的是typescript 2.0.3,所以我接受了David的答案
为此,您可以使用只读修饰符。只读的对象属性只能在对象初始化时赋值。
课堂上的例子:
class Circle {
readonly radius: number;
constructor(radius: number) {
this.radius = radius;
}
get area() {
return Math.PI * this.radius * 2;
}
}
const circle = new Circle(12);
circle.radius = 12; // Cannot assign to 'radius' because it is a read-only property.
在对象字面量中的例子:
type Rectangle = {
readonly height: number;
readonly width: number;
};
const square: Rectangle = { height: 1, width: 2 };
square.height = 5 // Cannot assign to 'height' because it is a read-only property
同样值得知道的是,readonly修饰符纯粹是一个typescript结构,当TS被编译到JS时,该结构将不会出现在编译后的JS中。当我们修改属性是只读的TS编译器会警告我们(这是有效的JS)。
TypeScript 2.0有readonly修饰符:
class MyClass {
readonly myReadOnlyProperty = 1;
myMethod() {
console.log(this.myReadOnlyProperty);
this.myReadOnlyProperty = 5; // error, readonly
}
}
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
}
}
MyClass.myReadOnlyProperty = 5; // error, readonly
这样做的好处是不能在构造函数中赋值,只存在于一个地方。