如何在 TypeScript 的类中声明常量

使用 readonly 修饰符在类中声明常量。 当类字段以 readonly 修饰符为前缀时,我们只能为类构造函数内部的属性赋值。 在构造函数之外对属性进行赋值会导致错误。

class Person {
  readonly name = 'Jiyik';
  readonly country = 'China';

  logCountry() {
    console.log(this.country);
  }
}

const person = new Person();

person.logCountry(); // ?️ "China"

console.log(person.name); // ?️ "Jiyik"

我们使用 readonly 修饰符来防止在构造函数之外对类属性进行赋值。

使用这种方法时,我们仍然可以在构造函数中更改属性的值。

class Person {
  readonly name: string = 'Jiyik';
  readonly country: string = 'China';

  constructor() {
    this.name = 'Bob';
    this.country = 'Belgium';
  }

  logCountry() {
    console.log(this.country);
  }
}

const person = new Person();

person.logCountry(); // ?️ "Belgium"

console.log(person.name); // ?️ "Bob"

如果我们不想在构造函数中更改 readonly 属性的值,则可以将 static 关键字与 readonly 一起使用。

class Person {
  // ?️ public 如果需要从类外访问
  public static readonly firstName = 'Jiyik';

  // ?️ 如果只需要从此类内部访问,则为private
  private static readonly country = 'China';

  // ?️ 如果只需要从此类及其子类访问,则为 protected
  protected static readonly age = 30;

  logProperties() {
    console.log(Person.firstName);
    console.log(Person.country);
    console.log(Person.age);
  }
}

console.log(Person.firstName); // ?️ "Jiyik"

firstName 属性被标记为 public,这意味着它可以在任何地方访问(类内和类外)。

私有可见性只允许从类内部访问。

标记为受保护的成员仅对类本身及其子类可见。

确保我们正在访问类的静态属性和方法,例如 Person.firstName,而不是类的实例。

另一种方法是在类之外声明一个常量并在类中使用它。

const firstName = 'Jiyik';

class Person {
  logName() {
    console.log(firstName);
  }
}

const person = new Person();

person.logName(); // ?️ "Jiyik"

选择哪种方法是个人喜好的问题。 我会选择使用 readonly 修饰符,因为我认为这是最直接、最直观的方法。