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의 경우 이미 구현 및 출시되어이 언어가 진화하는 속도를 보여줍니다!