타입스크립트는 제네릭을 사용하여 코드 재사용성을 높이고 유연한 타입 시스템을 구축할 수 있습니다. 제네릭을 이해하고 효과적으로 사용하기 위해 제네릭 타입의 변환 방식을 알아보겠습니다.
1. 제네릭 함수
제네릭 함수는 함수의 매개변수나 반환값의 타입을 일반화할 수 있게 해줍니다. 예를 들어, 배열을 입력으로 받고 첫 번째 요소를 반환하는 함수를 작성해보겠습니다.
function getFirstItem<T>(arr: T[]): T {
return arr[0];
}
const firstItem = getFirstItem<number>([1, 2, 3]);
위 예제에서 getFirstItem
함수는 제네릭 타입 T
를 사용하여 배열의 요소 타입을 동적으로 처리할 수 있습니다.
2. 제네릭 클래스
제네릭 클래스는 클래스의 속성이나 메서드의 타입을 일반화할 수 있게 해줍니다. 예를 들어, 스택 자료구조를 구현하는 제네릭 클래스를 작성해보겠습니다.
class Stack<T> {
private items: T[] = [];
push(item: T) {
this.items.push(item);
}
pop(): T | undefined {
return this.items.pop();
}
}
const numberStack = new Stack<number>();
numberStack.push(1);
위 예제에서 Stack
클래스는 제네릭 타입 T
를 사용하여 임의의 타입에 대해 동작할 수 있습니다.
3. 타입 제한
제네릭 타입을 사용할 때 타입 제한을 설정하여 특정 타입만을 받도록 제한할 수 있습니다. 예를 들어, 숫자 타입만을 처리할 수 있는 제네릭 함수를 작성해보겠습니다.
function sum<T extends number>(a: T, b: T): T {
return a + b;
}
const result = sum(10, 20);
위 예제에서 T extends number
를 사용하여 sum
함수가 숫자 타입에 대해서만 동작하도록 제한하였습니다.
4. 타입 변환
일반화된 제네릭 타입을 구체적인 타입으로 변환할 수 있습니다. 예를 들어, Array
타입을 제네릭으로 변환하여 배열을 생성하는 방법은 다음과 같습니다.
const numberArray: Array<number> = [1, 2, 3];
위 예제에서 Array<number>
는 숫자 타입의 배열을 의미합니다.
요약
타입스크립트에서의 제네릭을 활용하여 함수와 클래스의 유연한 타입 처리를 가능케 합니다. 제네릭 함수와 클래스, 타입 제한, 타입 변환 등을 활용하여 보다 안정적이고 유연한 코드를 작성할 수 있습니다.
위에서 살펴본 내용을 토대로, 제네릭을 적극 활용하여 타입 안정성을 높이고 코드의 재사용성을 개선할 수 있습니다.