第3ç« ð§©âš åæåªå ã®è¶ åºæ¬ãéšåãæã£ãŠå§è²ãããððš
ãŸãâ仿¥ã®ææ°ã¹ãããã·ã§ããâðïžâšâ
- TypeScript㯠5.9.3 ãææ°å®å®çïŒGitHub Releasesã§ âLatestâ 衚瀺ïŒã ãð (GitHub)
- Node.js 㯠v24 ã Active LTSãv22/v20 ã Maintenance LTSïŒå ¬åŒã®ãªãªãŒã¹è¡šïŒã ãð§· (Node.js)
- VS Code 㯠1.108ïŒDecember 2025ïŒã 2026/01/08 ãªãªãŒã¹ã«ãªã£ãŠããð§ (Visual Studio Code)
- TypeScript㯠**6.0ãã5.9â7.0ãžã®æ©æž¡ãã**ã«ãªãããšããæ¹éãå ¬éãããŠããð (Microsoft for Developers)
- Nodeã¯ãµããŒãäžã®è€æ°ã©ã€ã³ã« ã»ãã¥ãªãã£æŽæ°ã宿çã«åºããããã¢ããããŒãæèã倧äºð¡ïž (Node.js)
1) 仿¥ã®ãŽãŒã«ð¯ðâ
ãã®ç« ã§ã§ããããã«ãªãããšã¯ããã£ãããã ãâš
- **ãèªåã§å šéšãããªãã**ã§ãéšåã«ä»äºããé¡ãã§ããðð§©
- **has-aïŒããæã€ïŒ**ã§èããããããã«ãªãð
- âå·®ãæ¿ããããæªæ¥âã®åå°ãã€ãããð±ð
åæåªå ã®æå°ã³ã¢ã¯äžèšã§ãããšð **ãéšåãæã€ â éšåã«å§è²ããã**ð§©â¡ïžð€
2) has-a ã§èããç·Žç¿ðð§ïŒè¶ ã€ã¡ãŒãžïŒïŒâ
ç¶æ¿ïŒis-aïŒã¯ããã¯ãã§ããã åæïŒhas-aïŒã¯ãããæã£ãŠããã
ããšãã°âŠ
- è»ð㯠ãšã³ãžã³ãæã€ïŒhas-aïŒ
- 泚æãµãŒãã¹ðŠã¯ 決æžéšåãæã€ïŒhas-aïŒ
- ç»é¢ð¥ïžã¯ ãã¬ãŒãæã€ïŒhas-aïŒ
ãã€ã³ãã¯ãð **âèªåã®äžã«æ©èœãè©°ã蟌ãâããããªããŠãâå€ã®éšåãåŒã¶â**ã£ãŠæãâš
3) å§è²ïŒdelegateïŒã£ãŠãªã«ïŒðªð¬â

å§è²ã¯ãããããèããããã©ããã£ãŠãããšã¯è¶ ã·ã³ãã«ïŒ
ããã®ä»äºãããªãïŒéšåïŒãé¡ãïŒãðâš
ããšãã° OrderService ããæ¯æãåŠçããèªåã§æžããã«ãPaymentGateway ã«ãé¡ãããæãã ãð³ðŠ
4) ãŸãã¯ âæªããã©ãããã¡â ãªäŸðð¥â
ããšããããåããããã1ã¯ã©ã¹ã«å šéšè©°ããã¡âŠããããð¥²
// ãªãã§ããã£ã¡ãã OrderServiceïŒäŸïŒ
export class OrderService {
async placeOrder(userId: string, amount: number) {
// 1) æ€èšŒ
if (amount <= 0) throw new Error("amount must be > 0");
// 2) 決æžïŒå€éšã£ãœãåŠçïŒ
// æ¬åœã¯APIåŒã¶ãšãã ãã©ãããã«ãã¿æžãâŠ
console.log("charge start...");
await new Promise((r) => setTimeout(r, 200));
console.log(`charged: ${amount}`);
// 3) éç¥
console.log(`email sent to user=${userId}`);
// 4) ãã°ãèšæž¬ãè¶³ãããã¡âŠ
return { ok: true };
}
}
ããã®ã€ããðµâð«ðŠ
- 決æžã®ä»æ§ãå€ããð³ â OrderServiceãçŽã
- éç¥ã®ä»æ§ãå€ããð§ â OrderServiceãçŽã
- ãã¹ãããã𧪠â å€éšã£ãœãåŠçãæ··ãã£ãŠãŠé¢å
ã€ãŸã ã倿Žçç±ãå€ãããã ã®ãããã©ããã€ã³ãã ããð£
5) åæã®æå°åœ¢ð§©âšãéšåãæã£ãŠãéšåã«ãé¡ããããâ
ãããâéšååâããŠããé¡ããã圢ã«ããã£ãð
5-1) ãŸããéšåã®çŽæããäœãðâ
export interface PaymentGateway {
charge(amount: number): Promise<void>;
}
export interface Notifier {
notifyOrderCompleted(userId: string): Promise<void>;
}
5-2) éšåãå®è£ ããïŒä»®ã®ãã€ã§OKïŒð§â
export class FakePaymentGateway implements PaymentGateway {
async charge(amount: number) {
console.log(`(fake) charged: ${amount}`);
}
}
export class ConsoleNotifier implements Notifier {
async notifyOrderCompleted(userId: string) {
console.log(`(console) email sent to user=${userId}`);
}
}
5-3) OrderService ã¯ãæã£ãŠãåŒã¶ãã ãã«ããðŠâ¡ïžðâ
import { PaymentGateway, Notifier } from "./parts";
export class OrderService {
constructor(
private readonly payment: PaymentGateway,
private readonly notifier: Notifier
) {}
async placeOrder(userId: string, amount: number) {
if (amount <= 0) throw new Error("amount must be > 0");
// â
ãããâå§è²âïŒïŒèªåã§æ±ºæžããªã
await this.payment.charge(amount);
// â
ãããâå§è²âïŒïŒèªåã§éç¥ããªã
await this.notifier.notifyOrderCompleted(userId);
return { ok: true };
}
}
ã¯ã宿ãïŒðð§© OrderServiceã¯ãæé ã®åžä»€å¡ãã£ãœããªã£ãŠã现ããä»äºã¯éšåã«ä»»ãã圢ã«ãªããâš
6) âå³âã§èŠããšäžç¬ã§ãããð§ âšâ
[OrderService]
| has-a
+--> [PaymentGateway] (æ¯æãæ
åœð³)
+--> [Notifier] (éç¥æ
åœð§)
OrderService ã¯ãæµããã ãã
å®äœæ¥ã¯éšåãããïŒ
7) ãã§ãã¯ãã€ã³ãâ ããã®ã¯ã©ã¹ãå šéšãã£ãŠãªãïŒãðµïžââïžâ
次ã®ãµã€ã³ãåºãããåæã®åºçªããðâš
- ã¡ãœããã é·ãïŒã¹ã¯ããŒã«ã€ããððµïŒ
ifãå¢ããŸããïŒæ¡ä»¶å°çðªïžïŒconsole.logãèšæž¬ãå€éšåŒã³åºããæ··ããïŒãã¡ããŸãð²ïŒ- ã倿Žçç±ããè€æ°ããïŒæ±ºæžãéç¥ãâŠã¿ãããªïŒðð
âããåãæ¹âã®ã³ãã¯ð **ããããå¥ã®æ åœã«ã§ããªãïŒã**ã£ãŠèãããšðð¡
8) ããæŒç¿âïžðïŒ5ã10åïŒâ
æŒç¿AïŒè»ðãåæã§äœã£ãŠã¿ãïŒâ
Carã¯Engineã æã€Car.run()ã¯engine.start()ã åŒã¶ã ã
ãã³ãã³ãŒãð
interface Engine {
start(): void;
}
class GasEngine implements Engine {
start() { console.log("gas engine start!"); }
}
class Car {
constructor(private readonly engine: Engine) {}
run() {
this.engine.start(); // â
å§è²
console.log("car is running!");
}
}
9) âåæãããšãã¹ããã©ã¯âããã©èŠãð§ªâšâ
åæã®æé«ã®ãè€çŸã®ã²ãšã€ãããð ãã¹ãçšã®éšåïŒFake/MockïŒãå·®ãæ¿ããããããšïŒ
class SpyNotifier implements Notifier {
public called = false;
async notifyOrderCompleted(_: string) {
this.called = true;
}
}
// ãã¹ãã£ãœãäœ¿ãæ¹
const notifier = new SpyNotifier();
const service = new OrderService(new FakePaymentGateway(), notifier);
await service.placeOrder("u1", 100);
console.log(notifier.called); // true ã«ãªã£ãŠããOKâ
ãã®ãå·®ãæ¿ãã§ããæããðããæ¬¡ã®ç« 以éã§ã©ãã©ã匷ããªãããð±âš
10) AIæ¡åŒµã«ãé¡ããããªãïŒãã®ç« åãïŒð€ðªâ
Copilot/Codexã«æãããªãããããªæããåœããããããð¯
- ããã®ã¯ã©ã¹ã®è²¬åãåããŠã**éšåïŒinterfaceïŒ**ã«ããŠãå§è²ãã圢ã«ãªãã¡ã¯ã¿ããŠãð§©
- ãæ±ºæžåŠçã
PaymentGatewayã«æœåºããŠãOrderServiceã¯æµãã ãã«ããŠãð³â¡ïžðŠ - ããã¹ãçšã«
FakePaymentGatewayãšSpyNotifierãäœã£ãŠãð§ªâš
åºãŠããã³ãŒãã¯ãæåŸã«ããã ããã§ãã¯ããŠãâ
OrderServiceã å ·äœã¯ã©ã¹ã«ãã¿äŸåããããŠãªãïŒ- âéšåâã®ååã ããããšã«ãªã£ãŠãïŒïŒäŸïŒPaymentGateway/NotifierïŒ
- 1ã¡ãœããããæé ãã ãã«ãªã£ãŠãïŒïŒäœæ¥ãæ±ããŠãªãïŒïŒ
ãŸãšãðâšïŒãã®ç« ã®åèšèïŒâ
- has-a ã§èããð
- éšåãæã£ãŠãéšåã«å§è²ããð§©â¡ïžð€
- âåžä»€å¡âãšâäœæ¥å¡âãåãããšã倿Žã«åŒ·ããªãððª
次ã®ç« ã§ã¯ãåæã«å¿
é ãªãå·®ãæ¿ãã®çŽæãïŒ interface/type ããã£ãšäžæã«äœ¿ãç·Žç¿ã«å
¥ã£ãŠãããðâš