👀

アクセサ【個人学習まとめ】

2025/01/15に公開

アクセサ

アクセサにはゲッターセッターの2種類のメソッドが存在する。

ゲッター

まずはゲッターのみ。getキーワードをメソッドの前に宣言して定義する。

class Money {
    private _amount: number;

    constructor(amount: number) {
        this._amount = amount;
    }

    //ゲッターを定義
    get amount(): number {
        console.log("金額を取得");
        return this._amount;
    }
}
const money = new Money(500);
console.log(`${money.amount}`);
金額を取得
→500

ゲッターはプロパティにアクセスするようにmoney.amount記述することで実行される。

セッター

次にセッター。setキーワードをメソッドの前に宣言して定義する。

class Money {
    private _amount: number;

    constructor(amount: number) {
        this._amount = amount;
    }

    // ゲッターを定義
    get amount(): number {
        console.log("金額を取得");
        return this._amount;
    }

    // セッターを定義
+    set amount(value: number) {
+        if (value < 0) {
+            throw new Error("不正な値です")
+        }

+        console.log("金額を設定");
+        this._amount = value;
+    }
}
const money = new Money(500);
console.log(`${money.amount}`);
money.amount = 1000;
console.log(`${money.amount}`);

ここでは0未満はエラーとしている。
セッターは引数valueを受け取る。もし引数valueに型が指定されていなければゲッターの戻り値から型を判定する。

ゲッターやセッターを使うとプロパティの直接アクセスを制限することや、プロパティのアクセス時に特定の処理を実施させることができる。

余談

セッターに金額を計算する関数を追加。
プロパティの値をセットした直後に、maisu()が実行される。
こうすることにより、値をセットした後にわざわざmaisu()を呼び出す手間を省くことができる。

class CountMoney {
    private _amount: number;

    constructor(amount: number) {
        this._amount = amount;
    }

    // ゲッターを定義
    get amount(): number {
        console.log("金額を取得");
        return this._amount;
    }

    // セッターを定義
    set amount(value: number) {
        if (value < 0) {
            throw new Error("不正な値です")
        }

        console.log(`金額を設定 ${value}`);
        this._amount = value;

        this.maisu(this._amount);
    }

    private maisu(kingaku: number) {
        console.log("お金の枚数を算出");

        let tmpMoney = kingaku;

        const maisu10000 = Math.floor(tmpMoney / 10000);
        tmpMoney = tmpMoney % 10000;
        console.log(`1万円: ${maisu10000}`);

        const maisu5000 = Math.floor(tmpMoney / 5000);
        tmpMoney = tmpMoney % 5000;
        console.log(`5千円: ${maisu5000}`);

        const maisu1000 = Math.floor(tmpMoney / 1000);
        tmpMoney = tmpMoney % 1000;
        console.log(`1千円: ${maisu1000}`);

        const maisu500 = Math.floor(tmpMoney / 500);
        tmpMoney = tmpMoney % 500;
        console.log(`500円: ${maisu500}`);

        const maisu100 = Math.floor(tmpMoney / 100);
        tmpMoney = tmpMoney % 100;
        console.log(`100円: ${maisu100}`);

        const maisu50 = Math.floor(tmpMoney / 50);
        tmpMoney = tmpMoney % 50;
        console.log(`50円: ${maisu50}`);

        const maisu10 = Math.floor(tmpMoney / 10);
        tmpMoney = tmpMoney % 10;
        console.log(`10円: ${maisu10}`);

        console.log(`1円: ${tmpMoney}`);
    }
}

console.log("----");
const payMoney = new CountMoney(0);
payMoney.amount = 27850;
結果
金額を設定 27850
お金の枚数を算出
1万円: 2 枚
5千円: 1 枚
1千円: 2 枚
500円: 1 枚
100円: 3 枚
50円: 1 枚
10円: 0 枚
1円: 0 枚

Discussion