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

我发现自己需要在代码中明确指出不应该更改某个属性。我希望IDE或编译器在声明属性后,如果我试图将新值赋给属性时出错。你们是怎么做到的?

我目前正在使用只读属性,但我想知道是否有更好的方法:

get MY_CONSTANT():number {return 10};

我使用的是typescript 1.8。建议吗?

PS:我现在使用的是typescript 2.0.3,所以我接受了David的答案


当前回答

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

const MY_CONSTANT: string = "wazzup";

export class MyClass {

    public myFunction() {

        alert(MY_CONSTANT);
    }
}

其他回答

所有带有readonly的回复只适用于纯TS环境——如果它曾经被做成库,那么这实际上不会阻止任何事情,它只是为TS编译器本身提供警告。

静态也是不正确的——那是向类添加方法,而不是类的实例——所以你需要直接寻址它。

有几种方法可以管理这一点,但纯TS的方法是使用getter—就像您已经做的那样。

另一种方法是把它作为只读,但然后使用Object.defineProperty来锁定它-这几乎是通过getter完成的相同的事情,但你可以锁定它有一个值,而不是一个方法来获取它-

class MyClass {
    MY_CONSTANT = 10;

    constructor() {
        Object.defineProperty(this, "MY_CONSTANT", {value: this.MY_CONSTANT});
    }
}

默认情况下是只读的,但是查看文档了解更多细节。

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

const MY_CONSTANT: string = "wazzup";

export class MyClass {

    public myFunction() {

        alert(MY_CONSTANT);
    }
}

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

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

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

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";

你可以选择最适合你的。

你也可以简单地声明比如:src/classes/Car/consts/Honda.ts

export const CIVIC: string = "Civic";

export default {
    CIVIC: CIVIC
};

然后在类文件中执行如下操作:

import Honda from "./consts/Honda";

export class Car {

    protected model: string = Honda.Civic;

    [...]

}

export default Car;

这样,你就能确保它是一个常数。如果您正在构建数据集,这种方法也非常有用。