Typescript 전용 클래스 속성

Typescript는 클래스에 대한 개인 속성을 지원합니다.

Typescript 클래스의 액세스 제어

많은 프로그래밍 언어는 기본적으로 클래스의 속성을 비공개로 정의합니다. 인스턴스 외부에서 액세스 할 수 있도록하려면 일반적으로 관련 속성을 키워드 "public"으로 표시해야합니다.

Typescript 클래스에서도 동일한 키워드를 사용할 수 있지만 Typescript 클래스의 속성은 기본적으로 공개되므로 큰 영향을주지 않습니다. 이 제약 조건은 클래스의 비공개 속성을 지원하지 않는 자바 스크립트에서 상속됩니다. 글쎄, 최근까지.

자바 스크립트의 비공개 필드?

예, 아니오. 현재 Javascript 클래스에서 개인 속성을 정의하는 사양의 작업 초안은 3 단계에 있으며, 이는 최종 정의가 그럴듯하지만 아직 확실하지 않음을 나타냅니다.

사양에서 제안 된 변경 사항은 정말 간단하며 구문을 약간만 수정합니다. 속성을 비공개로 표시하려면 해시 태그를 접두사로 붙이면됩니다. 그게 다야!

class User {
  // A prop marked as private.
  #id;
  age;
  
  constructor(age){
    this.age = age;
    // Valid assignment, as we're 
    // within the class.
    this.#id = Math.floor(Math.random() * 1000);
  }
}

// ... Later in the code ...

const user = new User(42);
// Error! Won't work as it's private.
user.#id = 123;

Typescript의 개인 필드!

Typescript의 개인 속성에도 동일한 구문이 적용됩니다. 버전 3.8부터이 기능을 사용하여 인스턴스 및 정적 필드의 속성 및 함수에 대한 액세스를 더 잘 제어 할 수 있습니다. 구문은 Javascript 예제와 동일합니다.

잠시만 기다려주세요. 비공개 정적 필드?

예, 잘 읽었습니다. 정적 변수와 함수도 비공개 일 수 있습니다. 즉, 클래스 멤버 내에서만 호출 할 수 있습니다. 이 기능은 Typescript 버전 4.3과 함께 추가되었으며 내부적으로 추가 변경되었습니다. 버전 4.3에 대한 문서에 따르면 개인 클래스 멤버는 이제 런타임에 진정으로 개인이되어이 기능이 완전히 성숙되었음을 나타냅니다.

Typescript는 클래스에 대해 "private"의 두 가지 변형을 지원합니다. 일반적으로 알려진 것은 "private"키워드를 사용하여 파생 된 클래스에서도 표시된 필드에 액세스 할 수 없도록합니다.

여기에서 보여주고있는 새로운 기능인 다른 기능은 소위 "개인 이름"을 사용하는 것입니다. 스펙은 원래 JS에 의해 정의되었으므로 Javascript와 동일한 구문입니다. Typescript에서는 런타임 중에 액세스를 제어합니다.

/**
 * A class that uses already known
 * private props.
 */
class CommonUser {
  // Common 'private' prop in TS.
  private id: number;
  age: number;
  
  constructor(age: number){
    this.age = age;
    this.id = Math.floor(Math.random() * 1000);
  }
}

/**
 * Using the new sytanx for private class names.
 */
class SpecialUser {
  #id: number;
  age: number;
  
  constructor(age: number){
    this.age = age;
    // Valid, we're inside the class.
    this.#id = SpecialUser.#generateId();
  }
  
  static #generateId(){
    return Math.floor(Math.random() * 1000);
  }
  
  #stringifyId(){
    return this.#id.toString();
  }
}

// ... Later in the code ...

// Invalid, call is outside of class 'SpecialUser'.
SpecialUser.#generateId();

const user = new SpecialUser(42);
// And that won't work as well.
user.#stringifyId();

마지막 장의 마지막 단어

이 기사는 그리 길지 않지만 Typescript가 현재 제공하는 훌륭한 기능과 Typescript 자체의보다 일반적인 이점을 강조합니다. 자바 스크립트의 경우 비공개 속성은 아직 초안이지만 (아주 늦은 단계 임에도 불구하고) Typescript의 경우 이미 구현 및 출시되어이 언어가 진화하는 속도를 보여줍니다!