babel-dci demo
Compile
Run
Source
function TransferMoney(source: Account, destination: Account, amount: number) { banker = this; banker.transfer(); role banker { transfer() { source.withdraw(); destination.deposit(); } } role source { withdraw() { if (this.balance < amount) { throw Error('Insufficient funds'); } this.decreaseBalance(amount); } } role destination { deposit() { this.increaseBalance(amount); } } role amount {} } context Account { constructor(ledgers: ?Array
) { if (!ledgers) ledgers = []; } increaseBalance(amount: number) { ledgers.addEntry('depositing', amount); } decreaseBalance(amount: number) { ledgers.addEntry('withdrawing', 0 - amount); } get balance(): number { return ledgers.getBalance(); } role ledgers { addEntry(message: string, amount: number) { ledgers.push(new LedgerEntry(message, amount)); } getBalance(): number { return ledgers.reduce((sum, ledger) => ( sum + ledger.amount ), 0); } } } function LedgerEntry(message: string, amount: number) { this._message = message; this._amount = amount; } LedgerEntry.prototype = { constructor: LedgerEntry, get message(): string { return this._message; }, get amount(): number { return this._amount; } }; const source = new Account(); source.increaseBalance(30); const dest = new Account(); dest.increaseBalance(30); TransferMoney(source, dest, 10); console.log('source balance', source.balance); console.log('destination balance', dest.balance);
Output
Loading...