TypeScript의 확장 키워드는 일종의 스위스 군용 칼과 같습니다. 상속, 제네릭 및 조건부 유형을 포함한 여러 컨텍스트에서 사용됩니다. 확장을 효과적으로 사용하는 방법을 이해하면 더욱 강력하고 재사용 가능하며 유형이 안전한 코드를 얻을 수 있습니다.
extend의 주요 용도 중 하나는 상속입니다. 이를 통해 기존 인터페이스나 클래스를 기반으로 새 인터페이스나 클래스를 만들 수 있습니다.
interface User { firstName: string; lastName: string; email: string; } interface StaffUser extends User { roles: string[]; department: string; } const regularUser: User = { firstName: "John", lastName: "Doe", email: "john@example.com" }; const staffMember: StaffUser = { firstName: "Jane", lastName: "Smith", email: "jane@company.com", roles: ["Manager", "Developer"], department: "Engineering" };
이 예에서 StaffUser는 User를 확장하여 모든 속성을 상속하고 새 속성을 추가합니다. 이를 통해 보다 일반적인 유형을 기반으로 보다 구체적인 유형을 만들 수 있습니다.
extends 키워드는 클래스 상속에도 사용됩니다.
class Animal { constructor(public name: string) {} makeSound(): void { console.log("Some generic animal sound"); } } class Dog extends Animal { constructor(name: string, public breed: string) { super(name); } makeSound(): void { console.log("Woof! Woof!"); } fetch(): void { console.log(`${this.name} is fetching the ball!`); } } const myDog = new Dog("Buddy", "Golden Retriever"); myDog.makeSound(); // Output: Woof! Woof! myDog.fetch(); // Output: Buddy is fetching the ball!
여기서 Dog는 Animal을 확장하여 속성과 메서드를 상속하고 자신만의 속성을 추가합니다.
extends 키워드는 제네릭으로 작업할 때 매우 중요하며, 이를 통해 제네릭 함수나 클래스와 함께 사용할 수 있는 유형을 제한할 수 있습니다.
interface Printable { print(): void; } function printObject<T extends Printable>(obj: T) { obj.print(); } class Book implements Printable { print() { console.log("Printing a book."); } } class Magazine implements Printable { print() { console.log("Printing a magazine."); } } const myBook = new Book(); const myMagazine = new Magazine(); printObject(myBook); // Output: Printing a book. printObject(myMagazine); // Output: Printing a magazine. // printObject(42); // Error, number doesn't have a 'print' method
요약하자면, 함수 printObject
T extends U ? X : Y
type ExtractNumber<T> = T extends number ? T : never; type NumberOrNever = ExtractNumber<number>; // number type StringOrNever = ExtractNumber<string>; // never
여기서 ExtractNumber 유형은 유형 매개변수 T를 사용합니다. 조건부 유형은 T가 숫자 유형을 확장하는지 확인합니다. 그렇다면 유형은 T(숫자 유형)로 해석됩니다. 그렇지 않은 경우 유형은 never로 확인됩니다.
이제 A | 비 | C는 A를 확장합니다. 처음에는 반직관적으로 보일 수 있지만 TypeScript에서는 이 조건이 실제로 false입니다. 이유는 다음과 같습니다.
type Fruit = "apple" | "banana" | "cherry"; type CitrusFruit = "lemon" | "orange"; type IsCitrus<T> = T extends CitrusFruit ? true : false; type Test1 = IsCitrus<"lemon">; // true type Test2 = IsCitrus<"apple">; // false type Test3 = IsCitrus<Fruit>; // false
이 예에서는 IsCitrus
위 내용은 TypeScript 마스터하기: 확장의 힘 이해하기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!