front-end / / 2023. 11. 27. 06:49

[typescript] 제네릭

이 내용은 코드앙마의 타입스크립트 강좌를 정리해놓은 자료이다.

코드앙마 타입스크립트


제네릭 필요성

제네릭을 이용하면 클래스나 함수, 인터페이스를 다양한 타입으로 지정할 수 있다.

function getSize(arr: number[]): number {
    return arr.length;
}

const arr1 = [1, 2, 3];
getSize(arr1); // 3

숫자 배열을 넘기면 길이를 가져오는 함수이다.

다음은 문자열을 넘기는 함수를 만들어보자.

function getSize(arr: number[] | string[]): number {
    return arr.length;
}

const arr1 = [1, 2, 3];
getSize(arr1); // 3

const arr2 = ["1", "2", "3"];
getSize(arr2); // 3

이렇게 number[] | string[]를 지정하면 2가지 타입을 넘길 수 있다. 하지만 타입이 계속 늘어날 수 있다.

const arr1 = [1, 2, 3];
getSize(arr1); // 3

const arr2 = ["1", "2", "3"];
getSize(arr2); // 3

const arr3 = [false, true, true];
getSize(arr3); // 3

const arr4 = [{}, {}, {name: "Tim"}];
getSize(arr4); // 3

이럴때마다 계속 타입을 정의해줘야 한다. 이럴 때 사용할 수 있는게 제네릭이다.

제네릭

제네릭은 일반적으로 T로 정의한다.

function getSize<T>(arr: T[]): number {
    return arr.length;
}

const arr1 = [1, 2, 3];
getSize<number>(arr1); // 3

const arr2 = ["1", "2", "3"];
getSize<string>(arr2); // 3

const arr3 = [false, true, true];
getSize<boolean>(arr3); // 3

const arr4 = [{}, {}, {name: "Tim"}];
getSize<object>(arr4); // 3

실제 사용하는 곳에서 타입을 지정한다.

인터페이스에서 사용

이번에는 인터페이스에서 사용을 해보자.

interface Mobile {
    name: string;
    price: number;
    option: any; // any이다.
}

여기서 option은 any타입으로 어떤 타입이 올지 모르는 상황이다.

이런 경우는 아래와 같이 사용할 수 있다.

interface Mobile<T> {
    name: string;
    price: number;
    option: T;
}

const m1:Mobile<object> = {
    name: "s21",
    price: 1000,
    option: {
        color: "red",
        coupon: false
    }
};

const m2:Mobile<string> = {
    name: "s20",
    price: 900,
    option: "good"
}

m1에서 option 객체의 모습이 정해져 있다면 아래와 같이 사용할 수 있다.

const m1:Mobile<{color: string; coupon: boolean}> = {
    name: "s21",
    price: 1000,
    option: {
        color: "red",
        coupon: false
    }
};

함수에서 사용

다음을 보자.

interface User {
    name: string;
    age: number;
}

interface Car {
    name: string;
    color: string;
}

interface Book {
    price: number;
}

const user: User = { name: "a", age: 10 };
const car: Car = { name: "bmw", color: "red" };
const book: Book = { price: 3000 };

function showName(data): string {
    return data.name; //
}

showName(user);
showName(car);
showName(book);

위에서 user와 car는 name이 있지만 book은 name이 없어서 사용하면 안된다.

showName의 data는 any 타입인데 제네릭을 이용하여 타입을 넣어주자.

function showName<T extends {name: string}>(data:T): string {
    return data.name;
}

이 코드는 data의 타입이 올건데 name이 string인 타입이라는 의미이다. name이 없거나 name이 string이 아니라면 오류가 발생한다.

showName(user); // 정상
showName(car); // 정상
showName(book); // 오류
반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유