在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)。

其他回答

如果你想要封装常量,它不一定是一个类,它可以是一个命名空间,这里有不同的选项:

const MY_CONST_1 = "MyText"

这是最优的选项,并生成以下js:

const MY_CONST_1 = "MyText"

其他选项是封装在命名空间:

namespace Constants {
  export const MY_CONST_1: string = 'MyText';  
}

这将生成以下js:

var Constants;
(function (Constants) {
    Constants.MY_CONST_1 = 'MyText';
})(Constants || (Constants = {}));

和类的其他选项:

abstract class ConstantsClass {
    static readonly MY_CONST_1 = "MyText";
}

这将生成以下js:

class ConstantsClass {
}
ConstantsClass.MY_CONST_1 = "MyText";

你可以选择最适合你的。

对我来说,之前的答案都不管用。我确实需要将静态类转换为enum。 是这样的:

export enum MyConstants {
  MyFirstConstant = 'MyFirstConstant',
  MySecondConstant = 'MySecondConstant'
}

然后在我的组件中,我添加了其他答案中建议的新属性

export class MyComponent {
public MY_CONTANTS = MyConstans;
constructor() { }
}

然后在我的组件模板中,我这样使用它

<div [myDirective]="MY_CONTANTS.MyFirstConstant"> </div>

编辑:对不起。我的问题和OP的不同。如果别人有和我一样的问题,我还是会把它留在这里。

你可以在你的声明中用只读修饰符标记属性:

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

@see TypeScript Deep Dive book - Readonly

要么将readOnly修饰符与需要声明的常量一起使用,要么在类外声明一个常量,然后使用get操作符专门在所需的类中使用它。

常量可以在类外声明,在类内使用。否则,get属性是一个很好的变通方法

const MY_CONSTANT: string = "wazzup";

export class MyClass {

    public myFunction() {

        alert(MY_CONSTANT);
    }
}