예제를 통한 TypeScript 고급 제네릭 설명

TypeScript의 제네릭은 다양한 데이터 유형으로 작업하여 재사용 가능하고 유연한 코드 구성 요소를 만드는 방법을 제공합니다. 고급 제네릭은 제약 조건, 기본값 및 여러 유형과 같은 추가 기능을 도입하여 이 개념을 더욱 발전시켜 개발자가 보다 견고하고 유형 안전한 코드를 작성할 수 있도록 합니다. 이 문서에서는 예제를 사용하여 제네릭의 이러한 고급 개념을 살펴보겠습니다.

일반 제약 조건

제약 조건은 제네릭이 허용할 수 있는 유형을 제한합니다. 이를 통해 제네릭 함수나 클래스에 전달된 유형이 특정 기준을 충족하는지 확인할 수 있습니다. 예를 들어, 제약 조건을 사용하여 제네릭 유형에 특정 속성이나 메서드가 있는지 확인할 수 있습니다.

function getLength<T extends { length: number }>(arg: T): number {
    return arg.length;
}

const stringLength = getLength("TypeScript");
const arrayLength = getLength([1, 2, 3]);

이 예에서 <T extends { length: number }> 제약 조건은 getLength에 전달된 인수에 length 속성이 있는지 확인합니다.

여러 제네릭

TypeScript는 동일한 함수, 클래스 또는 인터페이스에서 여러 일반 유형을 사용할 수 있도록 합니다. 이는 여러 유형이 포함된 값 쌍 또는 기타 데이터 구조로 작업할 때 유용합니다.

function pair<T, U>(first: T, second: U): [T, U] {
    return [first, second];
}

const stringNumberPair = pair("TypeScript", 2024);

이 함수 pair는 두 가지 다른 일반 유형 TU을 허용하고 두 유형을 모두 포함하는 튜플을 반환합니다.

기본 일반 유형

TypeScript의 제네릭은 기본 유형을 가질 수도 있습니다. 이는 특정 유형이 제공되지 않을 경우 제네릭에 대체 유형을 원할 때 유용합니다.

function identity<T = string>(value: T): T {
    return value;
}

const defaultString = identity("Hello");  // T is string
const customNumber = identity<number>(100);  // T is number

이 예에서 identity에 아무 유형도 전달되지 않으면 string이 기본값으로 사용됩니다.

인터페이스와 함께 제네릭 사용

제네릭은 인터페이스와 함께 사용하여 유형이 고정되지 않은 복잡한 구조를 정의할 수 있습니다. 이는 데이터 관리 방법에 유연성을 더합니다.

interface Container<T> {
    value: T;
}

const stringContainer: Container<string> = { value: "Hello" };
const numberContainer: Container<number> = { value: 42 };

Container 인터페이스는 모든 유형의 값을 보관하도록 설계되어 특정 유형을 갖는 다양한 종류의 컨테이너를 허용합니다.

일반 클래스

TypeScript의 클래스는 일반적일 수도 있습니다. 이는 데이터 저장소나 컬렉션 클래스와 같이 다양한 데이터 유형으로 작동하는 클래스를 설계할 때 특히 유용합니다.

class DataStore<T> {
    private data: T[] = [];

    add(item: T): void {
        this.data.push(item);
    }

    getAll(): T[] {
        return this.data;
    }
}

const stringStore = new DataStore<string>();
stringStore.add("Hello");
stringStore.add("TypeScript");

const numberStore = new DataStore<number>();
numberStore.add(42);

이 예제에서 DataStore 클래스는 모든 유형의 데이터와 작동하면서 요소를 저장하고 검색하는 유형 안전한 방법을 제공합니다.

결론

TypeScript의 고급 제네릭은 유연하고 재사용 가능하며 유형이 안전한 코드를 작성하기 위한 강력한 도구입니다. 클래스와 인터페이스에서 제약 조건, 여러 유형, 기본값 및 제네릭을 사용하여 개발자는 더 복잡하고 견고한 코드를 작성할 수 있습니다. 이러한 고급 개념을 이해하고 활용하면 더 큰 유연성을 확보하고 애플리케이션 전반에서 유형 안전성을 보장할 수 있습니다.