AzLearn

تمرين إعادة البناء

Bank Account Ledger

أعد كتابة دفتر حساب TypeScript يستخدم أنواعاً واضحة للحركات والرصيد.

typescript ~14 دقيقة مبتدئ
أعد بناء الكود Rebuild

هذا هو الكود. اكتبه بنفسك.

الكود المرجعي
type TransactionType = "deposit" | "withdrawal";

interface LedgerTransaction {
  id: number;
  type: TransactionType;
  amountHalalas: number;
  note: string;
}

class BankAccount {
  private readonly transactions: LedgerTransaction[] = [];

  constructor(private readonly accountNumber: string) {}

  deposit(amountHalalas: number, note: string): void {
    this.addTransaction("deposit", amountHalalas, note);
  }

  withdraw(amountHalalas: number, note: string): void {
    if (amountHalalas > this.balanceHalalas()) {
      throw new Error("Insufficient balance");
    }

    this.addTransaction("withdrawal", amountHalalas, note);
  }

  balanceHalalas(): number {
    return this.transactions.reduce((total, transaction) => {
      return transaction.type === "deposit" ? total + transaction.amountHalalas : total - transaction.amountHalalas;
    }, 0);
  }

  statement(): string[] {
    return [
      `Account: ${this.accountNumber}`,
      ...this.transactions.map((transaction) => {
        return `${transaction.id}. ${transaction.type} ${formatRiyals(transaction.amountHalalas)} - ${transaction.note}`;
      }),
      `Balance: ${formatRiyals(this.balanceHalalas())}`,
    ];
  }

  private addTransaction(type: TransactionType, amountHalalas: number, note: string): void {
    if (!Number.isInteger(amountHalalas) || amountHalalas <= 0) {
      throw new Error("Amount must be positive halalas");
    }

    this.transactions.push({
      id: this.transactions.length + 1,
      type,
      amountHalalas,
      note,
    });
  }
}

function formatRiyals(halalas: number): string {
  return `${(halalas / 100).toFixed(2)} SAR`;
}

const account = new BankAccount("SA-1001");
account.deposit(250_00, "Opening balance");
account.withdraw(49_50, "Domain renewal");

for (const line of account.statement()) {
  console.log(line);
}
اكتب هنا