[typescript] Angular 구성 요소의 “private”및 “public”

내가 추가하지 않으면 개인을 하기 전에 foo, loadBar그리고 text, 나는 그들이 믿고 대중 기본적으로.

export class RandomComponent {
  @Input() foo: string;
  @Output() loadBar = new EventEmitter();
  text: string;
}

public구성 요소에 있을 때 사용 사례가 있습니까?

캡슐화 / 보안상의 이유로 항상 private아래와 같이 모두 추가해야 합니까?

export class RandomComponent {
  @Input() private foo: string;
  @Output() private loadBar = new EventEmitter();
  private text: string;
}

감사



답변

이 질문에 대한 답변으로 할 말이 많이 있는데, 이것이 내 마음에 떠오른 첫 번째 생각입니다.

무엇보다 먼저 private컴파일 타임 구조 일 뿐이며 런타임에 적용 할 수 없습니다 ( 관련 논의는 여기여기 를 참조 하세요 ). 따라서 private보안 목적으로 어떤 식 으로든 유용하다는 생각을 버리십시오 . 그것은 단순히 그것이 무엇에 관한 것이 아닙니다.

그것은 이다 캡슐화에 대해, 당신이 당신의 구성 요소에 필드 나 메소드가있을 때 당신이 그것을 다른 곳에서 액세스 할 수 없습니다 것을 취소하고, 거기에 캡슐화 할 것인지, 당신은 절대적으로 그것을 확인해야합니다 private: 그것은 무엇의 private입니다 : 무엇을 입었 든 수업 외부에서 건드리지 말아야한다는 의도를 나타냅니다.

똑같습니다 public: 이것도 컴파일 시간 전용 구조이므로 클래스 멤버가 public기본적으로 true이지만 런타임에 정확히 0의 의미를 갖습니다. 그러나 클래스 API의 일부로 외부 세계에 명시 적으로 노출하려는 멤버가있는 public경우이 의도를 알리기 위해 절대적으로 만들어야합니다 . 이것이 바로 그 이유 public입니다.

이것은 일반적으로 Typescript에 모두 적용됩니다. 특히 Angular에는 구성 요소 클래스에 공용 멤버를 사용하는 데 유효한 사용 사례가 있습니다. 예를 들어 컨테이너 / 구성 요소 (일명 smart / dumb ) 패턴을 구현할 때 “dumb”자식이 생성자 주입을 통해 “스마트”부모를 주입하는 경우, 부모의 구성원이 자녀가 만져서는 안되는 것과 접촉해서는 안되는 것에 대한 의도를 전달하는 것이 매우 중요합니다. 그렇지 않으면 부모의 술 캐비닛에서 장난을 치는 멍청한 아이를 잡을 때 놀라지 마십시오.

그래서, 귀하의 질문에 대한 나의 대답 :

항상 아래와 같이 모두 비공개로 추가해야합니까?

단호한 아니오 입니다. 키워드의 목적을 무너 뜨리기 때문에 항상 추가 해서는 안됩니다 private. 키워드를 어디에나두면 더 이상 의도를 나타내지 않기 때문입니다. 어디에도 두지 않는 것이 좋습니다.


답변

@drewmoore는 개인 / 공개가 의도로 요약된다는 점에서 좋은 답변을 제공합니다. 그러나 주입 된 개인 값을 사용할 때 고려해야 할 몇 가지 사항이 더 있습니다.

TypeScript를 AoT 컴파일 프로세스의 출력으로 내보내려면 구성 요소 템플릿의 공용 필드에만 액세스해야합니다 **


답변