TypeScriptにおけるgetterとsetterとは?使う理由と実践例を解説

プログラミング学習

TypeScriptでクラスを書いていると、
次のような構文を見かけます。

get value() {
  return this._value;
}

set value(v: number) {
  this._value = v;
}

「関数みたいだけど、呼び出し方はプロパティ?」
「普通に変数を直接触ればよくない?」
「正直、必要性が分からない」

私自身、JavaScriptでDOM操作や簡単なロジックを書いていた頃は、
getter・setterの存在意義が全く理解できませんでした。

結論から言うと、
getterとsetterは「値へのアクセスを制御するための仕組み」 です。


getterとsetterとは何か

getter(ゲッター)

getterは、
プロパティを取得するときに実行される関数 です。

class User {
  private _name: string = "ゆうき";

  get name() {
    return this._name;
  }
}
const user = new User();
console.log(user.name); // "ゆうき"

ポイントは、
関数なのに () を付けずにアクセスできる ことです。


setter(セッター)

setterは、
プロパティに値を代入するときに実行される関数 です。

class User {
  private _age: number = 0;

  set age(value: number) {
    this._age = value;
  }
}
const user = new User();
user.age = 20;

この代入の裏側で、
setterが呼ばれています。


なぜ直接プロパティを触らせないのか

問題例:直接変更できてしまう

class User {
  age: number = 0;
}

const user = new User();
user.age = -10; // 技術的には通ってしまう

TypeScriptは型は守りますが、
値の妥当性までは保証しません。


setterで値を制御する

class User {
  private _age: number = 0;

  set age(value: number) {
    if (value < 0) {
      console.error("年齢は0以上です");
      return;
    }
    this._age = value;
  }

  get age() {
    return this._age;
  }
}

これにより、

  • 不正な値の代入を防げる
  • ロジックを1箇所にまとめられる
  • 外部からの使い方はシンプルなまま

というメリットがあります。


getterは「計算結果」を返すのにも使える

getterは、
単なる値取得だけでなく、計算結果を返す用途 にも使えます。

class Rectangle {
  constructor(
    private width: number,
    private height: number
  ) {}

  get area() {
    return this.width * this.height;
  }
}
const rect = new Rectangle(10, 5);
console.log(rect.area); // 50

呼び出し側は、

  • 計算していることを意識しない
  • 普通のプロパティとして扱える

という利点があります。


なぜgetter/setterは関数ではなくプロパティ風なのか

user.getName()
user.setName("ゆうき")

この書き方だと、
内部実装が丸見え になります。

getter/setterを使うと、

user.name
user.name = "ゆうき"

という
自然なデータアクセス表現 が可能になります。

これは、

  • オブジェクトは「データの集合体」
  • 実装の詳細は隠す

という オブジェクト指向の考え方 に沿っています。


DOM操作・UIロジックとの相性

例えば、状態管理クラスがある場合です。

class Counter {
  private _count = 0;

  get count() {
    return this._count;
  }

  set count(value: number) {
    this._count = value;
    this.render();
  }

  render() {
    document.getElementById("count")!.textContent =
      String(this._count);
  }
}
counter.count++;

この一行で、

  • 状態更新
  • UI更新

をまとめて制御できます。

UIとロジックの分離を意識し始めた人ほど、
getter/setterの便利さが実感できます。


使いすぎには注意

getter/setterは強力ですが、

  • 単なる値の入れ物
  • ロジックが一切ない

場合は、
無理に使う必要はありません。

判断基準としては、

  • 値にルールがある
  • 将来ロジックが増えそう
  • 外部からの変更を制御したい

こうしたケースで使うのが適切です。


まとめ

  • getterは「取得時に処理を挟める」
  • setterは「代入時にルールを設けられる」
  • 値へのアクセスを安全に管理できる

TypeScriptのgetter・setterは、
「ただ動くコード」から「壊れにくい設計」へ進むための道具 です。

DOM操作や状態管理で
「ここ、直接触らせたくないな」と感じたら、
getter・setterの出番です。

コメント

タイトルとURLをコピーしました