Private Class Fields

3.8에서는 private 필드가 추가됩니다. 이는 하위 클래스(subclass)를 포함하여, 해당 필드를 가지고 있는 클래스 외부에서 사용할 수 없도록 하기 위한 클래스 필드 선언 방법입니다. 예를 들어, 아래의 Person 클래스는 클래스의 인스턴스를 사용하는 누구에게도 firstName, lastName 또는 prefix를 읽는 것을 허용하지 않습니다

class Person {
  #firstName: string;
  #lastName: string;
  #prefix: string;

  constructor(firstName: string, lastName: string, prefix: string) {
    this.#firstName = firstName;
    this.#lastName = lastName;
    this.#prefix = prefix;
  }

  greet() {
    // 아이슬란드에서는 [prefix] [lastname] 대신 전체 이름을 사용하는 것을 선호합니다
    // https://www.w3.org/International/questions/qa-personal-names#patronymic
    if (navigator.languages[0] === "is") {
      console.log(`Góðan dag, ${this.#firstName} ${this.#lastName}`);
    } else {
      console.log(`Hello, ${this.#prefix} ${this.#lastName}`);
    }
  }
}

let jeremy = new Person("Jeremy", "Bearimy", "Mr");

// 클래스 외부에서는 어떠한 private 필드에도 접근할 수 없습니다:

// 예를 들어, 이것은 동작하지 않을 것입니다:
console.log(jeremy.#lastName);

// 이것 또한:
console.log("Person's last name:", jeremy["#lastName"]);

// 우리는 흔히 "왜 클래스 필드에 있는 'private' 키워드 대신 이것을 사용하려고 하나요?"라는 질문을 받습니다. TypeScript 3.8 이전에 어떻게 동작했었는지 비교해 봅시다:
class Dog {
  private _name: string;
  constructor(name: string) {
    this._name = name;
  }
}

let oby = new Dog("Oby");
// 점 표기법으로 접근할 수 없습니다
oby._name = "Spot";
// 하지만 TypeScript는 예외 사항으로 대괄호 표기법을 허용합니다
oby["_name"] = "Cherny";

// private의 TypeScript 참조는 타입 레벨에서만 존재하므로 여러분이 여기까지만 신뢰할 수 있다는 의미입니다. private 필드가 곧 JavaScript 언어의 일부가 되면, 여러분의 코드의 가시성에 대해 더 나은 보장을 할 수 있습니다. 우리는 TypeScript에서 'private' 키워드를 지원 중단할 예정이 없습니다. 그래서 기존 코드는 계속 동작할 것이지만, 대신에 이제 여러분은 JavaScript 언어에 좀 더 가까운 코드를 작성할 수 있습니다. tc39 proposal에서 클래스 필드에 관하여 더 배울 수 있습니다 https://github.com/tc39/proposal-class-fields/ 그리고 베타 릴리즈 노트에서: https://devblogs.microsoft.com/typescript/announcing-typescript-3-8-beta/#ecmascript-private-fields