スタートページJavascriptTypeScript
TypeScriptの概要型指定の基本(1)型指定の基本(2)← 型指定の基本(3)→ 型指定の基本(4)

TypeScript 型指定の基本(3)Class


Class

Class の構成

    1  class 自動車クラス {
    2      // プロパティ
    3      車名: string;
    4      区分: string;
    5      排気量: number;
    6      // コンストラクタ
    7      constructor(車名: string, 区分: string, 排気量:number) {
    8          this.車名 = 車名;
    9          this.区分 = 区分;
   10          this.排気量 = 排気量; 
   11       }
   12       // メソッド
   13       車表示() {
   14           console.log(this.車名 + ", " + this.区分 + ", " + this.排気量)
   15       }
   16  }

プロパティ(property)

このクラスで用いる変数(通常はデータベースのレコードの属性)と型の定義です。
レコードが、
  自動車 = = new 自動車クラス(車名, 区分. 排気量);
ならば、車名, 区分. 排気量が列挙されます。

コンストラクタ(constructor)

データが入力されたときの初期設定です。
  constructor(車名: string, 区分: string, 排気量:number)
は、プロパティと重複していますが、これは外部から
  自動車 = new 自動車クラス(車名, 区分. 排気量);
として与えられることを想定しているからで、外部では
  自動車 = new 自動車クラス(name, type. cc);
の変数を用いているならば、
  constructor(name: string, type: string, cc:number) {
    this.車名 = name;
    this.区分 = type;
    this.排気量 = cc;
と指定します。

this とは、「ここでの」という意味です。「自動車.車名」の「自動車」を一般化しています。

メソッド

メソッドは、class 内で、this.xx をグローバル変数とした、関数の機能です。
ここでは、入力データを console.log していますが、関数と同様、この時点では実行されません。
外部から 車A.車表示(); のように呼び出せれた時点で実行されます。
通常の関数なら 車表示(車A)の形式になりますが、メソッドでは 車A.車表示() の形式になります。

クラスブロック外からの処理

   17 
   18  // クラスブロック外からの処理
   18  var 車A = new 自動車クラス('スカイライン', '乗用車',1500);
   19  車A.車表示();            // スカイライン, 乗用車,1500  class内のメソッドの実行
   20  console.log(車A.区分);   // 乗用車  class によりこのような形式ができる。
   21
   22  var 車B = new 自動車クラス('カーゴ', 'トラック',9200);
   23  if (車A.排気量 >= 車B.排気量) {  // このような通常のプログラムが記述できる。
   24      var 大排気量区分 = 車A.区分;
   25  }
   26  else 大排気量区分 = 車B.区分;
   27  console.log(大排気量区分);         // トラック
   28  
   29  var 車C = new 自動車クラス('カワサキ', 'オートバイ',400cc);  // 排気量の型エラー 

継承(inheritance)

「自動車クラス」をスーパークラスとして、サブクラス「乗用車クラス」を定義します。
スーパークラスでのプロパティ「車名、区分、排気量」の設定を継承し、さらに「乗車人数」を加えます。

   30
   31  // ========== サブクラス =============
   32  class 乗用車クラス extends 自動車クラス {
   33      乗車人数 : number;
   34      // コンストラクタ
   35      constructor(車名: string, 区分: string, 排気量:number. 乗車人数:number) {
   36         super(車名, 区分, 排気量);
   37         this.乗車人数 = 乗車人数;
   38      }
   39  }

サブクラスは、次の形式で定義します。
  class サブクラス extends スーパークラス { // extend は「拡張」の意
  }

スーパークラスからのプロパティを継承して、さらにサブクラスで新プロパティを追加するには、 コンストラクタで次の形式で指定します。
  constructor(入力される全プロパティと型) {
    super(継承するプロパティ);
    this.新プロパティ = 新プロパティ;
  }

クラスブロック外からの処理

   40  // 外部からの処理
   41  var 車D = new 乗用車クラス('マーク2', '乗用車',1500, 5);
   42  console.log(車D.乗車人数);  // 5  OK
   43  console.log(車B.乗車人数);  // エラー 車Bは自動車クラスで乗車人数項目はない
   44  var 車E = new 乗用車クラス('クラウン', '乗用車',2500);  // 乗車人数が欠けている

アクセス修飾子

Classのプロパティとメソッドは、アクセス修飾子により、アクセス可能/禁止を設定できます。
  一般形 アクセス修飾子 変数 : 型;
  例:  private 氏名: string;

public
外部からのアクセスを可能にする。省略のときはこれになります。
private
クラス内部のメソッドなど内部からのアクセスはできるが、外部からのアクセスは禁止
readonly
読取専用。コンストラクタで一度初期化したら書き直すことができない。

例示

  private 氏名: string;
  public 学部: string;
  readonly 年齢: number;
  private 氏名表示()  メソッド
と設定したとしの、
  内部処理 コンストラクタ内で記述
  外部処理(参照)
  外部処理(更新)
でのエラーチェックをしています。

   1  class 学生クラス {
   2      // プロパティ
   3      private  氏名: string;
   4      public   学部: string;
   5      readonly 年齢: number;
   6      // コンストラクタ
   7      constructor(氏名: string, 学部: string, 年齢: number) {
   8          this.氏名 = 氏名;
   9          this.学部 = 学部;
  10          this.年齢 = 年齢;
  11          // 内部処理
  12          this.年齢++;        // 内部処理は修飾子に関係なく処理できます。
  13          console.log(this.氏名 + ", " + this.学部 + ", " + this.年齢);
  14        // "阿部, 文学部, 21" 年齢は入力データが20だったのが21になる
  15      }
  16      // メソッド
  17      private 氏名表示() {
  18          console.log(this.氏名)
  19      }
  20      学部表示() {          // 修飾子省略 public
  21          console.log(this.学部)
  22      }
  23  }
  24
  25  // レコードの作成
  26    var 学生A = new 学生クラス('阿部','文学部',20); // 修飾子に関係なく読み込まれます。
  27  // 外部からの参照
  28    console.log(学生A.氏名);    // 氏名は private なので外部からアクセスできません。
  29    console.log(学生A.学部);    // 学部は public なので、外部からアクセスできます。
  30    console.log(学生A.年齢);    // 年齢は readonly なので、更新はできないが読むことはできます。
  31    学生A.氏名表示();           // このメソッドは private なので外部からアクセスできません。
  32    学生A.学部表示();           //このメソッドは public なので外部からアクセスできます。 
  33  // 外部からの更新
  34    学生A.氏名 = '井上';        // 氏名は private なので外部から更新できません。
  35    学生A.学部 = '工学部';      // 学部は public なので外部から更新できます。
  36    学生A.年齢 = 22;            // 年齢は readonly なので更新できません。