この動画はメンバー限定動画です

全ての講座が
月額990円で学び放題

講座の情報を見る

TypeScript入門ゲッター・セッターを定義しよう

記事を共有:

  • X
  • Pocket
  • クリップボードにコピー

前のレッスンで、在庫を減らすプログラムを作成しました。しかし、これはメソッドを使わなくてもプロパティを直接利用して、次のように作ることもできます。

class Item {
  name: string = "";
  stock: number = 0;
}

let peach = new Item();
peach.name = "もも";
peach.stock = 5;

// 購入する
peach.stock -= 3;
console.log(peach.stock); // 2

このように、直接プロパティを操作してしまえば良いのではないでしょうか?

しかし、実際にはこのようにプロパティの値を直接プログラムで操作してしまうのは、あまり好ましいとは言えません。なぜなら、現状では次のように在庫数以上に減らすこともできてしまいます。

// 購入する
peach.stock -= 6;
console.log(peach.stock); // -1

そこで、プロパティを操作するときはクラス側でしっかりと検査や操作を行って、正しい動作をするように定義した方が良いでしょう。それにはプロパティに直接アクセスせずに、専用のメソッドを使ってアクセスできるようにします。これを「ゲッター」および「セッター」といいます。

プロパティにアクセス修飾子をつけよう

まずは、プロパティに直接アクセスができないようにします。stockの先頭に「private」という宣言を追加しましょう。

private stock: number = 0;

すると、次のようなプロパティを直接扱っている箇所はエラーになります。

peach.stock = 5;

アクセス修飾子には、privateとpublic、protectedの3種類があります。省略した場合は、どこからでもアクセスができるpublicになります。そのため、次のように宣言することもできます。

public name: string = "";

protectedについては、後ほど紹介します。

なお、プライベートとして宣言されるプロパティは、先頭にアンダースコアをつけるという慣習があります。必須ではありませんが、分かりやすいプログラムにするためにも習っておくと良いでしょう。

public name: string = "";
private _stock: number = 0;

ゲッター・セッターを準備しよう

そしたら、ゲッターとセッターを準備しましょう。「set」や「get」といった宣言を利用します。

set stock(value: number) {

プロパティ名にアンダースコアをつけた代わりに、ゲッター・セッターに同じ名前を付加しています。この時、プロパティ名にアンダースコアがない場合は「名前が重複している」というエラーになってしまうので気をつけましょう。

では、内容も実装していきましょう。

set stock(value: number) {
  if (value >= 0) {
    this._stock = value;
  } else {
    this._stock = 0;
  }
}
get stock(): number {
  return this._stock;
}

次のように、プロパティと同じように利用できます。

peach.stock = 5;
console.log(peach.stock); // 5

しかし、今回の場合セッターの方にはif構文が作られています。在庫数に負の数が設定されるのはおかしいので、0未満の場合は強制的に0にするという処理を追加しています。

そのため、次のように負の数を設定しても0に補正されます。

peach.stock = -5;
console.log(peach.stock); // 0

こうして、プロパティの値を信頼して利用できるようになります。

前のレッスン 次のレッスン