é«åºŠãªTypeScript OOPãã¿ãŒã³ãæ¢æ±ããŸãããã®ã¬ã€ãã§ã¯ãã¯ã©ã¹èšèšã®ååãç¶æ¿ãšã³ã³ããžã·ã§ã³ã®è°è«ãã¹ã±ãŒã©ãã«ã§ä¿å®å¯èœãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®å®è·µçãªæŠç¥ãã°ããŒãã«ãªèªè åãã«è§£èª¬ããŸãã
TypeScript OOPãã¿ãŒã³ïŒã¯ã©ã¹èšèšãšç¶æ¿æŠç¥ã®ã¬ã€ã
çŸä»£ã®ãœãããŠã§ã¢éçºã®äžçã§ã¯ãTypeScriptã¯å ç¢ã§ã¹ã±ãŒã©ãã«ããã€ä¿å®å¯èœãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®åºç€ãšããŠç»å ŽããŸãããJavaScriptäžã«æ§ç¯ããã匷åãªåã·ã¹ãã ã«ãããéçºè ã¯æ©æã«ãšã©ãŒãæ€åºããããäºæž¬å¯èœãªã³ãŒããäœæããããã®ããŒã«ãæã«å ¥ããããšãã§ããŸããTypeScriptã®åã®æ žå¿ã«ã¯ããªããžã§ã¯ãæåããã°ã©ãã³ã°ïŒOOPïŒã®ååã«å¯Ÿããå æ¬çãªãµããŒãããããŸããããããåã«ã¯ã©ã¹ãäœæããæ¹æ³ãç¥ã£ãŠããã ãã§ã¯ååã§ã¯ãããŸãããTypeScriptãç¿åŸããã«ã¯ãã¯ã©ã¹èšèšãç¶æ¿éå±€ãããã³ç°ãªãã¢ãŒããã¯ãã£ãã¿ãŒã³ã®éã®ãã¬ãŒããªããæ·±ãçè§£ããå¿ èŠããããŸãã
ãã®ã¬ã€ãã¯ãäžçŽã¹ãã«ãåºããŠããéçºè ããçµéšè±å¯ãªã¢ãŒããã¯ããŸã§ãã°ããŒãã«ãªéçºè audience åãã«èšèšãããŠããŸããTypeScriptã«ãããOOPã®ã³ã¢ã³ã³ã»ãããæ·±ãæãäžãã广çãªã¯ã©ã¹èšèšæŠç¥ãæ¢æ±ããé·å¹Žã®è°è«ã§ããç¶æ¿å¯Ÿã³ã³ããžã·ã§ã³ã«åãçµã¿ãŸããæçµçã«ã¯ãããã¯ãªãŒã³ã§æè»æ§ããããå°æ¥ãèŠæ®ããã³ãŒãããŒã¹ã«ã€ãªããæ å ±ã«åºã¥ããèšèšäžã®æææ±ºå®ãè¡ãããã®ç¥èã身ã«ã€ããããšãã§ããŸãã
TypeScriptã«ãããOOPã®æ±ã®çè§£
è€éãªãã¿ãŒã³ãæãäžããåã«ãTypeScriptã«é©çšããããªããžã§ã¯ãæåããã°ã©ãã³ã°ã®4ã€ã®åºæ¬çãªæ±ã忀èšããŠããã£ãããšããåºç€ã確ç«ããŸãããã
1. ã«ãã»ã«å
ã«ãã»ã«åãšã¯ããªããžã§ã¯ãã®ããŒã¿ïŒããããã£ïŒãšããã®ããŒã¿ãæäœããã¡ãœãããåäžã®ãŠãããïŒã¯ã©ã¹ïŒã«ãã³ãã«ããååã§ãããŸãããªããžã§ã¯ãã®å
éšç¶æ
ãžã®çŽæ¥ã¢ã¯ã»ã¹ãå¶éããããšãå«ãŸããŸããTypeScriptã¯ãäž»ã«ã¢ã¯ã»ã¹ä¿®é£Ÿåpublicãprivateãããã³protectedãéããŠãããå®çŸããŸãã
äŸïŒæ®é«ãé éããã³åŒãåºãã¡ãœãããéããŠã®ã¿å€æŽã§ããéè¡å£åº§ã
class BankAccount {
private balance: number = 0;
constructor(initialBalance: number) {
if (initialBalance >= 0) {
this.balance = initialBalance;
}
}
public deposit(amount: number): void {
if (amount > 0) {
this.balance += amount;
console.log(`Deposited: ${amount}. New balance: ${this.balance}`);
}
}
public getBalance(): number {
// We expose the balance through a method, not directly
return this.balance;
}
}
2. æœè±¡å
æœè±¡åãšã¯ãè€éãªå®è£
ã®è©³çްãé ãããªããžã§ã¯ãã®éèŠãªæ©èœã®ã¿ãå
¬éããããšãæå³ããŸããããã«ãããäžã«ããè€éãªä»çµã¿ãçè§£ããå¿
èŠãªããé«ã¬ãã«ã®æŠå¿µãæäœã§ããŸããTypeScriptã§ã¯ãæœè±¡åã¯abstractã¯ã©ã¹ãšinterfacesã䜿çšããŠå®çŸãããããšããããããŸãã
äŸïŒãªã¢ã³ã³ã䜿çšããå Žåãã黿ºããã¿ã³ãæŒãã ãã§ããèµ€å€ç·ä¿¡å·ãå éšåè·¯ã«ã€ããŠç¥ãå¿ èŠã¯ãããŸããããªã¢ã³ã³ã¯ãTVã®æ©èœãžã®æœè±¡çãªã€ã³ã¿ãŒãã§ãŒã¹ãæäŸããŸãã
3. ç¶æ¿
ç¶æ¿ã¯ãæ°ããã¯ã©ã¹ïŒãµãã¯ã©ã¹ãŸãã¯æŽŸçã¯ã©ã¹ïŒãæ¢åã®ã¯ã©ã¹ïŒã¹ãŒããŒã¯ã©ã¹ãŸãã¯åºæ¬ã¯ã©ã¹ïŒããããããã£ãšã¡ãœãããç¶æ¿ããã¡ã«ããºã ã§ããã³ãŒãã®åå©çšãä¿é²ããã¯ã©ã¹éã«æç¢ºãªãis-aãé¢ä¿ã確ç«ããŸããTypeScriptã¯ãç¶æ¿ã«extendsããŒã¯ãŒãã䜿çšããŸãã
äŸïŒ`Manager`ã¯`Employee`ã®ãis-aãã¿ã€ãã§ãã`name`ã`id`ã®ãããªå ±éã®ããããã£ãå ±æããŸããã`Manager`ã¯`subordinates`ã®ãããªè¿œå ã®ããããã£ãæã€å ŽåããããŸãã
class Employee {
constructor(public name: string, public id: number) {}
getProfile(): string {
return `Name: ${this.name}, ID: ${this.id}`;
}
}
class Manager extends Employee {
constructor(name: string, id: number, public subordinates: Employee[]) {
super(name, id); // Call the parent constructor
}
// Managers can also have their own methods
delegateTask(): void {
console.log(`${this.name} is delegating tasks.`);
}
}
4. ããªã¢ãŒãã£ãºã
ãå€ãã®åœ¢ããæå³ããããªã¢ãŒãã£ãºã ã¯ãç°ãªãã¯ã©ã¹ã®ãªããžã§ã¯ããå ±éã®ã¹ãŒããŒã¯ã©ã¹ã®ãªããžã§ã¯ããšããŠæ±ãããšãå¯èœã«ããŸããããã«ãããåäžã®ã€ã³ã¿ãŒãã§ãŒã¹ïŒã¡ãœããåãªã©ïŒãç°ãªãåºã«ãªã圢åŒïŒå®è£ ïŒã衚ãããšãã§ããŸããããã¯ãã¡ãœããã®ãªãŒããŒã©ã€ããéããŠå®çŸãããããšããããããŸãã
äŸïŒ`Circle`ãªããžã§ã¯ããš`Square`ãªããžã§ã¯ãã§`render()`ã¡ãœããã®åäœãç°ãªãå Žåã§ããäž¡æ¹ãšã`Shape`ã§ãã
abstract class Shape {
abstract draw(): void; // An abstract method must be implemented by subclasses
}
class Circle extends Shape {
draw(): void {
console.log("Drawing a circle.");
}
}
class Square extends Shape {
draw(): void {
console.log("Drawing a square.");
}
}
function renderShapes(shapes: Shape[]): void {
shapes.forEach(shape => shape.draw()); // Polymorphism in action!
}
const myShapes: Shape[] = [new Circle(), new Square()];
renderShapes(myShapes);
// Output:
// Drawing a circle.
// Drawing a square.
倧è«äºïŒç¶æ¿å¯Ÿã³ã³ããžã·ã§ã³
ããã¯OOPã«ãããæãéèŠãªèšèšäžã®æææ±ºå®ã®1ã€ã§ããçŸä»£ã®ãœãããŠã§ã¢ãšã³ãžãã¢ãªã³ã°ã«ãããäžè¬çãªç¥æµã¯ããç¶æ¿ãããã³ã³ããžã·ã§ã³ãåªå ãããããšã§ããäž¡æ¹ã®æŠå¿µãè©³çŽ°ã«æ¢æ±ããããšã§ããã®çç±ãçè§£ããŸãããã
ç¶æ¿ãšã¯ïŒãis-aãã®é¢ä¿
ç¶æ¿ã¯ãåºæ¬ã¯ã©ã¹ãšæŽŸçã¯ã©ã¹ã®éã«å¯ãªçµåãäœæããŸãã`extends`ã䜿çšãããšãæ°ããã¯ã©ã¹ãåºæ¬ã¯ã©ã¹ã®ç¹æ®ãªããŒãžã§ã³ã§ããããšã瀺ããŸããæç¢ºãªéå±€é¢ä¿ãååšããå Žåãã³ãŒãã®åå©çšã«åœ¹ç«ã€åŒ·åãªããŒã«ã§ãã
- é·æïŒ
- ã³ãŒãã®åå©çšïŒå ±éã®ããžãã¯ã¯åºæ¬ã¯ã©ã¹ã§äžåºŠå®çŸ©ãããŸãã
- ããªã¢ãŒãã£ãºã ïŒ`Shape`ã®äŸã«èŠãããããã«ããšã¬ã¬ã³ããªããªã¢ãŒãã£ãã¯ãªåäœãå¯èœã«ããŸãã
- æç¢ºãªéå±€ïŒçŸå®äžçã®ãããããŠã³åé¡ã·ã¹ãã ãã¢ãã«åããŸãã
- çæïŒ
- å¯ãªçµåïŒåºæ¬ã¯ã©ã¹ã®å€æŽã¯ã掟çã¯ã©ã¹ãæå³ããã«å£ãå¯èœæ§ããããŸããããã¯ãè匱ãªåºæ¬ã¯ã©ã¹ã®åé¡ããšããŠç¥ãããŠããŸãã
- éå±€å°çïŒé床ã®äœ¿çšã¯ãçè§£ããã³ä¿å®ãå°é£ãªãæ·±ããè€éã§ã硬çŽããç¶æ¿ãã§ãŒã³ã«ã€ãªããå¯èœæ§ããããŸãã
- æè»æ§ã®æ¬ åŠïŒã¯ã©ã¹ã¯TypeScriptïŒåäžç¶æ¿ïŒã§ä»ã®1ã€ã®ã¯ã©ã¹ããã®ã¿ç¶æ¿ã§ãããããå¶éãããå¯èœæ§ããããŸããè€æ°ã®ç¡é¢ä¿ãªã¯ã©ã¹ããæ©èœãç¶æ¿ããããšã¯ã§ããŸããã
ç¶æ¿ãè¯ãéžæã§ããã®ã¯ãã€ã§ããïŒ
é¢ä¿ãæ¬åœã«ãis-aãã§ãããå®å®ããŠããŠã倿Žãããå¯èœæ§ãäœãå Žåã¯ãç¶æ¿ã䜿çšããŸããããšãã°ã`CheckingAccount`ãš`SavingsAccount`ã¯ã©ã¡ããåºæ¬çã«`BankAccount`ã®ã¿ã€ãã§ãããã®éå±€ã¯çã«ããªã£ãŠããããªã¢ãã«ãããå¯èœæ§ã¯äœãã§ãããã
ã³ã³ããžã·ã§ã³ãšã¯ïŒãhas-aãã®é¢ä¿
ã³ã³ããžã·ã§ã³ãšã¯ãããå°ãããç¬ç«ãããªããžã§ã¯ãããè€éãªãªããžã§ã¯ããæ§ç¯ããããšã§ããã¯ã©ã¹ãäœãä»ã®ãã®ã§ãã代ããã«ãå¿ èŠãªæ©èœãæäŸããä»ã®ãªããžã§ã¯ããæã£ãŠããŸããããã«ãããã¯ã©ã¹ã¯æ§æããããªããžã§ã¯ãã®ãããªãã¯ã€ã³ã¿ãŒãã§ãŒã¹ãšã®ã¿å¯Ÿè©±ãããããçãªçµåãäœæãããŸãã
- é·æïŒ
- æè»æ§ïŒæ§æããããªããžã§ã¯ãã亀æããããšã§ãå®è¡æã«æ©èœã倿Žã§ããŸãã
- çãªçµåïŒå å«ã¯ã©ã¹ã¯ã䜿çšããã³ã³ããŒãã³ãã®å éšåäœãç¥ãå¿ èŠã¯ãããŸãããããã«ãããã³ãŒãã®ãã¹ããšä¿å®ã容æã«ãªããŸãã
- éå±€ã®åé¡ã®åé¿ïŒçµ¡ã¿åã£ãç¶æ¿ããªãŒãäœæããã«ãããŸããŸãªãœãŒã¹ããã®æ©èœãçµã¿åãããããšãã§ããŸãã
- æç¢ºãªè²¬ä»»ïŒåã³ã³ããŒãã³ãã¯ã©ã¹ã¯ãåäžè²¬ä»»ã®ååã«æºæ ã§ããŸãã
- çæïŒ
- å®åå¥ã®å¢å ïŒåçŽãªç¶æ¿ã¢ãã«ãšæ¯èŒããŠãç°ãªãã³ã³ããŒãã³ããé ç·ããããã«ããå€ãã®ã³ãŒããå¿ èŠã«ãªãå ŽåããããŸãã
- éå±€ã«é¢ããçŽæã®äœäžïŒç¶æ¿ã»ã©èªç¶ãªå顿³ãçŽæ¥ã¢ãã«åããŸããã
å®è·µçãªäŸïŒè»
`Car`ã¯ãã³ã³ããžã·ã§ã³ã®å®ç§ãªäŸã§ãã`Car`ã¯`Engine`ã®ã¿ã€ãã§ãã`Wheel`ã®ã¿ã€ãã§ããããŸããã代ããã«ã`Car`ã¯ãšã³ãžã³ãæã¡ããã€ãŒã«ãæã£ãŠããŸãã
// Component classes
class Engine {
start() {
console.log("Engine starting...");
}
}
class GPS {
navigate(destination: string) {
console.log(`Navigating to ${destination}...`);
}
}
// The composite class
class Car {
private readonly engine: Engine;
private readonly gps: GPS;
constructor() {
// The Car creates its own parts
this.engine = new Engine();
this.gps = new GPS();
}
driveTo(destination: string) {
this.engine.start();
this.gps.navigate(destination);
console.log("Car is on its way.");
}
}
const myCar = new Car();
myCar.driveTo("New York City");
ãã®èšèšã¯éåžžã«æè»æ§ããããŸãã`ElectricEngine`ãåãã`Car`ãäœæãããå Žåãæ°ããç¶æ¿ãã§ãŒã³ã¯å¿ èŠãããŸãããäŸåæ§æ³šå ¥ã䜿çšããŠãã³ã³ããŒãã³ãã`Car`ã«æäŸã§ãããããããã«ã¢ãžã¥ãŒã«åãããŸãã
interface IEngine {
start(): void;
}
class PetrolEngine implements IEngine {
start() { console.log("Petrol engine starting..."); }
}
class ElectricEngine implements IEngine {
start() { console.log("Silent electric engine starting..."); }
}
class AdvancedCar {
// The car depends on an abstraction (interface), not a concrete class
constructor(private engine: IEngine) {}
startJourney() {
this.engine.start();
console.log("Journey has begun.");
}
}
const tesla = new AdvancedCar(new ElectricEngine());
tesla.startJourney();
const ford = new AdvancedCar(new PetrolEngine());
ford.startJourney();
TypeScriptã®é«åºŠãªæŠç¥ãšãã¿ãŒã³
ç¶æ¿ãšã³ã³ããžã·ã§ã³ã®åºæ¬çãªéžæè¢ãè¶ ããŠãTypeScriptã¯æŽç·Žãããæè»ãªã¯ã©ã¹èšèšãäœæããããã®åŒ·åãªããŒã«ãæäŸããŸãã
1. æœè±¡ã¯ã©ã¹ïŒç¶æ¿ã®ãã«ãŒããªã³ã
匷åãªãis-aãé¢ä¿ããããåºæ¬ã¯ã©ã¹ãåç¬ã§ã€ã³ã¹ã¿ã³ã¹åã§ããªãããã«ããå Žåã¯ã`abstract`ã¯ã©ã¹ã䜿çšããŸãããããã¯ãã«ãŒããªã³ããšããŠæ©èœããå ±éã®ã¡ãœãããšããããã£ãå®çŸ©ããæŽŸçã¯ã©ã¹ãå¿ ãå®è£ ããå¿ èŠããã`abstract`ã¡ãœããã宣èšã§ããŸãã
ãŠãŒã¹ã±ãŒã¹ïŒæ±ºæžåŠçã·ã¹ãã ããã¹ãŠã®ã²ãŒããŠã§ã€ã«`pay()`ããã³`refund()`ã¡ãœãããå¿ èŠã§ããããšãç¥ã£ãŠããŸãããå®è£ ã¯åãããã€ããŒïŒStripeãPayPalãªã©ïŒã«åºæã§ãã
abstract class PaymentGateway {
constructor(public apiKey: string) {}
// A concrete method shared by all subclasses
protected connect(): void {
console.log("Connecting to payment service...");
}
// Abstract methods that subclasses must implement
abstract processPayment(amount: number): boolean;
abstract issueRefund(transactionId: string): boolean;
}
class StripeGateway extends PaymentGateway {
processPayment(amount: number): boolean {
this.connect();
console.log(`Processing ${amount} via Stripe.`);
return true;
}
issueRefund(transactionId: string): boolean {
console.log(`Refunding transaction ${transactionId} via Stripe.`);
return true;
}
}
// const gateway = new PaymentGateway("key"); // Error: Cannot create an instance of an abstract class.
const stripe = new StripeGateway("sk_test_123");
stripe.processPayment(100);
2. ã€ã³ã¿ãŒãã§ãŒã¹ïŒåäœã®ã³ã³ãã©ã¯ãã®å®çŸ©
TypeScriptã®ã€ã³ã¿ãŒãã§ãŒã¹ã¯ãã¯ã©ã¹ã®åœ¢ç¶ã®ã³ã³ãã©ã¯ããå®çŸ©ããæ¹æ³ã§ããã¯ã©ã¹ãæã€å¿ èŠã®ããããããã£ãšã¡ãœãããæå®ããŸãããå®è£ ã¯æäŸããŸãããã¯ã©ã¹ã¯è€æ°ã®ã€ã³ã¿ãŒãã§ãŒã¹ã`implement`ã§ãããããã³ã³ããžã·ã§ã³èšèšããã³ççµåèšèšã®åºç€ãšãªããŸãã
ã€ã³ã¿ãŒãã§ãŒã¹å¯Ÿæœè±¡ã¯ã©ã¹
- 坿¥ã«é¢é£ããè€æ°ã®ã¯ã©ã¹éã§å®è£ ãããã³ãŒããå ±æããå Žåã¯ãæœè±¡ã¯ã©ã¹ã䜿çšããŸãã
- ç°ãªãç¡é¢ä¿ã®ã¯ã©ã¹ã«ãã£ãŠå®è£ ã§ããåäœã®ã³ã³ãã©ã¯ããå®çŸ©ããå Žåã¯ãã€ã³ã¿ãŒãã§ãŒã¹ã䜿çšããŸãã
ãŠãŒã¹ã±ãŒã¹ïŒã·ã¹ãã ã§ã¯ãå€ãã®ç°ãªããªããžã§ã¯ããæåå圢åŒã«ã·ãªã¢ã«åããå¿ èŠãããå ŽåããããŸãïŒãã°èšé²ãŸãã¯ã¹ãã¬ãŒãžãªã©ïŒããããã®ãªããžã§ã¯ãïŒ`User`ã`Product`ã`Order`ïŒã¯ç¡é¢ä¿ã§ãããå ±éã®æ©èœãå ±æããŠããŸãã
interface ISerializable {
serialize(): string;
}
class User implements ISerializable {
constructor(public id: number, public name: string) {}
serialize(): string {
return JSON.stringify({ id: this.id, name: this.name });
}
}
class Product implements ISerializable {
constructor(public sku: string, public price: number) {}
serialize(): string {
return JSON.stringify({ sku: this.sku, price: this.price });
}
}
function logItems(items: ISerializable[]): void {
items.forEach(item => {
console.log("Serialized item:", item.serialize());
});
}
const user = new User(1, "Alice");
const product = new Product("TSHIRT-RED", 19.99);
logItems([user, product]);
3. ããã¯ã¹ã€ã³ïŒã³ãŒãåå©çšãžã®ã³ã³ããžã·ã§ã³ã¢ãããŒã
TypeScriptã¯åäžç¶æ¿ã®ã¿ãèš±å¯ãããããè€æ°ã®ãœãŒã¹ããã®ã³ãŒããåå©çšãããå Žåã¯ã©ãããã°ããã§ããããïŒããã§ãããã¯ã¹ã€ã³ãã¿ãŒã³ãç»å ŽããŸããããã¯ã¹ã€ã³ã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒãåãåããæ°ããæ©èœã§æ¡åŒµãããæ°ããã³ã³ã¹ãã©ã¯ã¿ãŒãè¿ã颿°ã§ããããã¯ãã¯ã©ã¹ã«æ©èœããããã¯ã¹ã€ã³ãã§ããã³ã³ããžã·ã§ã³ã®åœ¢åŒã§ãã
ãŠãŒã¹ã±ãŒã¹ïŒè€æ°ã®ã¢ãã«ã¯ã©ã¹ã«`Timestamp`ïŒ`createdAt`ã`updatedAt`ä»ãïŒãš`SoftDeletable`ïŒ`deletedAt`ããããã£ãš`softDelete()`ã¡ãœããä»ãïŒã®åäœã远å ããããšèããŠããŸãã
// A Type helper for mixins
type Constructor = new (...args: any[]) => T;
// Timestamp Mixin
function Timestamped(Base: TBase) {
return class extends Base {
createdAt: Date = new Date();
updatedAt: Date = new Date();
};
}
// SoftDeletable Mixin
function SoftDeletable(Base: TBase) {
return class extends Base {
deletedAt: Date | null = null;
softDelete() {
this.deletedAt = new Date();
console.log("Item has been soft deleted.");
}
};
}
// Base class
class DocumentModel {
constructor(public title: string) {}
}
// Create a new class by composing mixins
const UserAccountModel = SoftDeletable(Timestamped(DocumentModel));
const userAccount = new UserAccountModel("My User Account");
console.log(userAccount.title);
console.log(userAccount.createdAt);
userAccount.softDelete();
console.log(userAccount.deletedAt);
çµè«ïŒå°æ¥ãèŠæ®ããTypeScriptã¢ããªã±ãŒã·ã§ã³ã®æ§ç¯
TypeScriptã§ã®ãªããžã§ã¯ãæåããã°ã©ãã³ã°ã®ç¿åŸã¯ãæ§æã®çè§£ããèšèšå²åŠã®åãå ¥ããŸã§ã®éã®ãã§ããã¯ã©ã¹æ§é ãç¶æ¿ãããã³ã³ã³ããžã·ã§ã³ã«é¢ããŠè¡ãéžæã¯ãã¢ããªã±ãŒã·ã§ã³ã®é·æçãªå¥å šæ§ã«å€§ããªåœ±é¿ãäžããŸãã
ã°ããŒãã«ãªéçºãã©ã¯ãã£ã¹ã®ããã®äž»èŠãªãã€ã³ããæ¬¡ã«ç€ºããŸãã
- æ±ããå§ããïŒã«ãã»ã«åãæœè±¡åãç¶æ¿ãããã³ããªã¢ãŒãã£ãºã ããã£ãããšææ¡ããŠããããšã確èªããŠãã ããããããã¯OOPã®èªåœã§ãã
- ç¶æ¿ãããã³ã³ããžã·ã§ã³ãåªå ããïŒãã®ååã«ãããããæè»æ§ããããã¢ãžã¥ãŒã«åããããã¹ãå¯èœãªã³ãŒãã«ã€ãªãããŸããã³ã³ããžã·ã§ã³ããå§ããŠãæç¢ºã§å®å®ãããis-aãé¢ä¿ãååšããå Žåã«ã®ã¿ãç¶æ¿ã䜿çšããŸãã
- ãžã§ãã«é©ããããŒã«ã䜿çšããïŒ
- å®å®ããéå±€ã§ã®çã®å°éåãšã³ãŒãå ±æã«ã¯ãç¶æ¿ã䜿çšããŸãã
- ããã€ãã®å®è£ ãå ±æããªããã³ã³ãã©ã¯ãã匷å¶ãããã¯ã©ã¹ãã¡ããªãŒã®å ±éããŒã¹ãå®çŸ©ããã«ã¯ãæœè±¡ã¯ã©ã¹ã䜿çšããŸãã
- ä»»æã®ã¯ã©ã¹ã§å®è£ ã§ããåäœã®ã³ã³ãã©ã¯ããå®çŸ©ããã«ã¯ãã€ã³ã¿ãŒãã§ãŒã¹ã䜿çšããŠã極端ãªççµåãä¿é²ããŸãã
- è€æ°ã®ãœãŒã¹ããã¯ã©ã¹ã«æ©èœãæ§æããå¿ èŠãããå Žåã¯ãããã¯ã¹ã€ã³ã䜿çšããŠãåäžç¶æ¿ã®å¶éãå æããŸãã
ãããã®ãã¿ãŒã³ã«ã€ããŠæ¹å€çã«èãããã®ãã¬ãŒããªããçè§£ããããšã§ã仿¥åŒ·åã§å¹ççã§ããã ãã§ãªããé©å¿ãæ¡åŒµãããã³ä¿å®ã容æãªTypeScriptã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸããäžçäžã®ã©ãã«ããŠããããªããŸãã¯ããªãã®ããŒã ãã