TypeScriptでgetter・setterを理解しよう!初心者でもわかるプロパティの使い方
生徒
「先生、TypeScriptでクラスの値を直接触らずに読み書きできる方法ってありますか?」
先生
「いい質問ですね。TypeScriptではgetterとsetterを使えば、値を安全に読み書きできますよ。」
生徒
「それは便利そうですね!どうやって使うんですか?」
先生
「それでは、基本的な構文と使い方を順番に見ていきましょう。」
1. getter・setterとは?
TypeScriptにおけるgetter(ゲッター)は「値を取り出すための仕組み」、setter(セッター)は「値を設定するための仕組み」です。
普通のプロパティ(変数のようなもの)に直接アクセスするのではなく、クラスの外側から安全に値を読み書きできるようにするために使われます。
たとえば「体重をマイナスの数値では保存させない」など、制御を加えたいときに便利です。
日常の例で言うと、テレビのリモコンがgetter・setterに似ています。本体の回路(クラスの内部)を直接触らなくても、リモコン(getter・setter)を通してチャンネルを変えたり音量を調整したりできるイメージです。
2. getterの定義方法と使い方
まずはgetterから見てみましょう。getterはgetキーワードを使って定義します。外部から値を読み取るときに、自動的にこのメソッドが呼ばれます。
class Person {
private _name: string;
constructor(name: string) {
this._name = name;
}
// getter
get name(): string {
return this._name;
}
}
const p = new Person("太郎");
console.log(p.name); // getterが呼ばれる
太郎
このように、外部からはp.nameと普通のプロパティにアクセスするように書きますが、実際には内部でget name()が呼び出されています。
3. setterの定義方法と使い方
setterは値を設定するときに使います。setキーワードを使って定義します。引数を1つ取り、その値をクラスの内部に保存したり、チェックしたりすることができます。
class Person {
private _age: number = 0;
// getter
get age(): number {
return this._age;
}
// setter
set age(value: number) {
if (value < 0) {
console.log("年齢はマイナスにはできません。");
return;
}
this._age = value;
}
}
const p = new Person();
p.age = 25; // setterが呼ばれる
console.log(p.age);
p.age = -5; // バリデーションにより拒否される
25
年齢はマイナスにはできません。
このように、setterを使えば値を設定する際にチェック処理を入れることができます。これにより不正な値が入るのを防げます。
4. getter・setterを組み合わせた実用例
getterとsetterを組み合わせると、より実用的なクラスを作ることができます。例えば、銀行口座クラスを考えてみましょう。
class BankAccount {
private _balance: number = 0;
get balance(): number {
return this._balance;
}
set balance(amount: number) {
if (amount < 0) {
console.log("残高をマイナスに設定することはできません。");
return;
}
this._balance = amount;
}
}
const account = new BankAccount();
account.balance = 1000; // setterで残高を設定
console.log(account.balance); // getterで残高を取得
account.balance = -500; // エラーメッセージが出力される
1000
残高をマイナスに設定することはできません。
このように、getterとsetterを利用することで、クラスのデータを保護しつつ、直感的に読み書きができる仕組みを作れます。
5. getter・setterを使うメリット
TypeScriptでgetter・setterを使うと、次のようなメリットがあります。
- クラス内部のデータを安全に管理できる
- データを読み書きする際に条件や制御を加えられる
- 外部からは通常のプロパティのように見えるため、使いやすさが向上する
これは、プログラムの信頼性を高め、エラーを防ぐのにとても役立ちます。
まとめ
getter・setterを使った安全で柔軟なプロパティ管理の振り返り
TypeScriptでのgetter・setterは、クラス内部のデータを安全に扱うための大切な仕組みであり、値にアクセスする際の窓口の役割を果たします。 記事の中で学んできたように、getterは「値を読み取るための自動的な入口」、setterは「値を書き込む際の制御ポイント」として機能します。 これにより、クラスの外からプロパティを直接変更するのではなく、安全に制御しながら必要なデータだけを扱うことができます。 とくに設定時にバリデーション(チェック処理)を挟める点は、現実のアプリケーションでは非常に重要です。 たとえば年齢や金額のように、負の値が入ってはいけないケースでは、setterでチェックするだけで安全性が大きく向上します。 また、getter・setterは通常のプロパティと同じ書き方で使えるため、外部からの操作は直感的でわかりやすく、コードの見通しも改善されます。 さらに、クラスの内部構造を変更したとしても、getter・setter側で吸収できるため、外部に影響が出にくく保守性が高まるという利点もあります。 情報をそのまま露出させず、必要なタイミングで必要な形に加工して使える仕組みは、アプリケーションの質を高める非常に大きな要素です。 特にオブジェクト指向の学習において、プロパティの保護と安全な参照方法という概念は欠かせない基礎となるため、強く押さえておきたいポイントです。
getter・setterを応用したサンプルコード
以下では、複数の条件を組み合わせ、より実用的なデータ管理を行うサンプルとして「商品クラス」を取り上げます。 価格、在庫、商品名を管理し、getter・setterを使って安全に値を扱う例です。
class Product {
private _name: string = "";
private _price: number = 0;
private _stock: number = 0;
get name(): string {
return this._name;
}
set name(value: string) {
if (value.trim() === "") {
console.log("商品名は空にできません。");
return;
}
this._name = value;
}
get price(): number {
return this._price;
}
set price(value: number) {
if (value < 0) {
console.log("価格はマイナスにできません。");
return;
}
this._price = value;
}
get stock(): number {
return this._stock;
}
set stock(value: number) {
if (value < 0) {
console.log("在庫数はマイナスにはできません。");
return;
}
this._stock = value;
}
}
const item = new Product();
item.name = "ノートパソコン";
item.price = 120000;
item.stock = 15;
console.log(item.name);
console.log(item.price);
console.log(item.stock);
item.price = -500; // エラー
item.stock = -1; // エラー
このサンプルでは、3つのプロパティに対してそれぞれgetterとsetterを用意し、値を書き込むときに必要なチェックを行っています。
価格や在庫数のように間違った値が入ると致命的な結果を招く恐れがあるケースでは、getter・setterによるコントロールは非常に有効です。
また、外からはitem.priceのように通常のプロパティ操作と同じ感覚で扱えるため、可読性も損なわれません。
この「安全性」と「直感的な使いやすさ」の両立が、getter・setterの大きな魅力と言えます。
getter・setterで広がるクラス設計の応用範囲
getter・setterは、単純な値管理だけでなく、さまざまな場面で利用できます。 例えば、値に応じてメッセージを返す加工、内部の計算値を外部にわかりやすく変換するためのプロパティ、ログ出力を挟む仕組みなど、多彩な用途で役立ちます。 また、値の出し入れのルールを統一することで、大規模プロジェクトでも安全にデータを扱える基盤が整い、開発チーム全体の作業効率も向上します。 TypeScriptの型の力と組み合わせることで、より信頼性の高いシステム構築にもつながるため、今後の学習において確実に身につけておきたい要素です。
生徒
「getterとsetterって、ただの読み書きじゃなくて安全にデータを扱う仕組みだったんですね!」
先生
「そうなんです。制御を加えたい場面では特に役立ちますよ。値のチェックや加工も簡単にできます。」
生徒
「普通のプロパティみたいに使えるのに、裏ではちゃんとメソッドが動いているのが便利ですね。」
先生
「そのおかげで柔軟なクラス設計がしやすいんです。内部構造を隠しつつ、安全な操作方法を提供できますからね。」
生徒
「これなら大きいアプリでも間違いが減りそうです!」
先生
「まさにその通り。getter・setterはクラス設計の基礎としてとても重要なので、今後の学習でもどんどん使ってみてください。」