第11章. クラス
この作品はAIを使って翻訳されている。ご意見、ご感想をお待ちしている:translation-feedback@oreilly.com
2012年にTypeScriptが初めてリリースされたとき、JavaScriptのエコシステムとJavaScript言語の機能は、現在のものとは比較にならなかった。TypeScriptは、型システムという形だけでなく構文にも多くの機能を導入し、モジュール、名前空間、型にまたがってコードの一部を抽象化する可能性によって、すでに存在する言語を豊かにした。
そのひとつが、オブジェクト指向プログラミングの定番であるクラスだ。TypeScriptのクラスはもともとC#から多くの影響を受けており、両プログラミング言語の開発者を知っていれば驚くことではない。1しかし、TypeScriptのクラスは、放棄されたECMAScript 4の提案の概念に基づいて設計されている。
クラスはプライベートフィールド、スタティックブロック、デコレータとともにECMAScript標準の一部となり、ブラウザとサーバの言語ランタイムに出荷されている。
これによりTypeScriptは、初期に言語にもたらしたイノベーションと、TypeScriptチームが今後の型システムのすべての機能のベースラインとして考えている標準との間のスイートスポットに位置することになる。オリジナルのデザインはJavaScriptが最終的に採用したものに近いが、特筆すべき違いもいくつかある。
この章では、TypeScriptとJavaScriptにおけるクラスの振る舞い、表現の可能性、標準とオリジナルのデザインの違いについて見ていく。キーワード、TypeScript、ジェネリクスに注目し、TypeScriptがJavaScriptに追加したもの、JavaScriptが独自にもたらしたものを見極める目を養う。
11.1 正しい可視性修飾子を選ぶ
問題
1つは特殊化されたキーワード構文(public 、protected 、private)で、もう1つは実際のJavaScript構文で、プロパティがハッシュ文字で始まる場合である。どちらを選ぶべきか?
解決策
JavaScriptネイティブの構文は、実行時に見逃したくない意味を持つので、そちらを選ぶこと。visibility修飾子のバリエーションを含む複雑なセットアップに依存しているのであれば、TypeScriptのものを使い続けよう。それらはGoにはならない。
ディスカッション
TypeScriptのクラスはかなり以前から存在しており、数年後に登場したECMAScriptのクラスから大きなインスピレーションを得ているが、TypeScriptチームは、当時伝統的なクラスベースのオブジェクト指向プログラミングで便利で人気があった機能を導入することにした。
そのひとつがプロパティの可視性修飾子で、アクセス修飾子とも呼ばれる。可視性修飾子とは、メンバ(プロパティやメソッド)の前に置く特殊化キーワードのことで、コンパイラに、それらがソフトウェアの他の部分からどのように見え、どのようにアクセスできるかを指示することができる。
注
すべての可視性修飾子は、JavaScriptのプライベート・フィールドと同様に、プロパティだけでなくメソッドに対しても機能する。
デフォルトの可視性修飾子はpublic で、明示的に記述することも、単に省略することもできる:
classPerson{publicname;// ...