1. ホーム
  2. typescript

[解決済み] 「Angularコンポーネントのprivateとpublicについて

2022-07-04 03:41:28

質問

もし プライベート の前に 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 であるという事実は、実行時には全く意味を持ちません。しかし、クラスの API の一部として外部に公開することを明示的に意図しているメンバがある場合、そのメンバは絶対に public にして、その意図を伝える必要があります。これは public はそのためのものです。

これはすべて、一般的なTypescriptに当てはまります。Angular では特に、コンポーネントクラスに public メンバを持つことの有効なユースケースがあることは確かです。例えば コンテナ/コンポーネント (別名 スマート/ダム ) パターンでは、quot;dumb" の子供がコンストラクタ インジェクションによって "smart" の親に注入するため、親上のどのメンバーが子供に触るべきで、触らせないかという意図を伝えることが非常に重要です。 そうでなければ、親の酒棚でふざけている馬鹿な子供を捕まえても驚かないでしょう。

では、質問に対する私の答えです。

は、以下のように常に全てにprivateを付けるべきでしょうか?

は強調された ではありません。 . あなたは 常に 加える private というのも、そうすることでキーワードの目的が達成されないからです。どこにも配置しないほうがよいでしょう。