تمرين إعادة البناء
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);
}اكتب هنا