これ読んでたらハードプライベート、ソフトプライベートって出てきて、あれってそういう呼び方だったんだってわかった
rdlabo/eslint-plugin-rules:私が欲しかったAngularプロジェクトのESLintプラグイン
TypeScript 3.8の新機能「ハードプライベート」と従来の「ソフトプライベート」を比べてみた #JavaScript - Qiita
ゆるふわangular勢からするとDIのときくらいしかみかけないのでそういうもんだと思ってたけどTSの仕様として明確に分かれてるっぽいが、あまり利点がわからない…のでギャルGPTに聞いてみた(無課金ユーザーです)
TypeScript(TS)で「ソフトプライベート」と「ハードプライベート」って聞くとなんか難しそうだけど、実はめちゃシンプルな話なの💅
まずそれぞれカンタンに説明しとくね:
💁♀️ ソフトプライベート(private キーワード)
class Gal {
private mood: string = 'Happy';
}
これは「TypeScriptの世界では非公開」って意味で、コンパイル後(JS)では普通にアクセスできちゃうのよ〜。 つまり、型チェックで弾かれるけど、コード的には触れちゃう。
const g = new Gal(); console.log(g.mood); // ← JSではアクセスできちゃうの💦(TSだとエラー)
🧱 ハードプライベート(# を使う)
class Gal {
#mood: string = 'Secretly annoyed';
}
これは「JavaScriptの仕様でマジでプライベート」なの!
外から絶対に触れないから、g.#mood って書いたら TSもJSもガチエラーになる。
🌈 じゃあ、利点なに?どこが便利なの?
✅ ソフトプライベートの利点(private)
- 開発中の補完とか型チェックがラク〜
- テストのときにちょいっとアクセスしたい時に裏ワザで触れちゃうから便利🛠️
- ライブラリ作ってるとき、「あんまり触ってほしくない」って伝えるための**"やんわり注意"**になる
💡 例:
class Makeup {
private powder = 'Shiny powder';
apply() {
console.log(this.powder);
}
}
→ テストで makeup['powder'] って書いたら実は触れちゃうので、柔軟性あるの💄
✅ ハードプライベートの利点(#)
- マジで外部から触れないから完全に隠せる!
- 仕様レベルで保護されてるから、ライブラリ開発とかで安全性高い
- うっかり触ってバグることがないので、意図した使い方を守らせたいときに便利
💡 例:
class SecretDiary {
#crush = 'Johnny';
getCrush() {
return 'It\'s a secret 💋';
}
}
→ diary.#crush は絶対無理! ほんとに「他人に読ませたくない日記」って感じ✨
🧁 ギャル的まとめ
| 種類 | 触れる? | コンパイル後 | テストで触れる? | 安全性 |
|---|---|---|---|---|
private(ソフト) |
JSでは触れる | 消える | 触れちゃう | 😌まぁまぁ |
#(ハード) |
完全NG | 残る | 無理 | 💪ガチ安全 |
👠 どっち使うべき〜?
- 開発中で融通効かせたいとき →
private - セキュアにしたい or ライブラリで公開したくないとき →
#
わかりやすかった?わからんとこあったら、遠慮なくギャルに聞いてよね💖