ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [TypeScript] 타입스크립트 제네릭 타입 설명 및 예제
    TypeScript 2022. 5. 25. 19:05

    타입스크립트 제네릭 타입 설명 및 예제

    타입스크립트 제네릭타입

    안녕하세요. gaki 입니다.

    오늘은 타입스크립트의 제네릭 타입에 대해서 알아보겠습니다.

     

    <목차>

    1. 제네릭의 뜻

    2. 타입스크립트 제네릭타입 예제

    3. 타입스크립트 제네릭타입의 응용

     


    1. 제네릭의 뜻

    제네릭(generic)이란, 일반적인 이라는 뜻을 가진 형용사입니다.

    무언가가 일반적이려면, 보편적이여야하고 많은 사람들을 수용할 수 있어야합니다.

    타입스크립트에서 제네릭 타입이란 많은 타입을 수용할 수 있는 타입입니다.

    이게 무슨말인지 헷갈리시면 아래의 예제를 보면 이해되실겁니다.

     


    2. 타입스크립트 제네릭타입 예제

    function identity(arg: any): any {
    	return arg
    }

    위와 같이 어떤 인자를 받고 그 인자를 반환하는 identity 라는 함수가 있다고 가정해봅시다.

    이 함수의 인자는 무슨 타입이던 받을 수 있다는 의미로서 any 를 사용합니다.

    하지만 타입스크립트의 가이드에서는 any 타입의 사용을 지양합니다.

    타입스크립트는 변수의 타입을 지정해줌으로서, 예상치 못한 동작을 방지하기 위해서 사용하는데 any 타입을 쓰면 타입스크립트를 쓰는 이유가 없기 때문이죠.

     

    우리는 그럼 위 함수를 어떻게 발전시킬 수 있을까요?

    다시 곰곰이 생각해봅시다.

    함수의 인자는 특정한 타입의 값을 가지며, 그 리턴값 또한 함수의 인자의 값과 동일한 타입입니다.

    하지만 타입이 number 일지 string 일지 아니면 Object 일지 알 수 없습니다.

    이런 경우에 타입스크립트의 제네릭타입이 사용됩니다.

    function identity<T>(arg:T):T {
    	return arg
        };

    함수의 이름 옆에 <T> 라고 적힌 부분이 보이시나요?

    저 <T> 가 제네릭 타입의 문법입니다.

    이 뜻은, T 타입을 매개 변수로 받고, T 타입을 arg 의 타입으로, 함수의 리턴값 타입으로 사용하겠다는 의미입니다.

    identity<string>("apple");
    identity<number>(5);
    identity<number[]>([1,2,3]);
    
    
    // 타입의 값이 복잡하지 않다면, 타입스크립트가 자동으로 인자의 타입을 추론해서 <T> 에 넘겨줌.
    identity("apple");
    identity(5);

    이와 같이 함수를 호출할 때, <type> 형식으로 타입을 제공해줌으로서 함수를 호출할 때, 타입을 지정해줄 수 있습니다.

    이것이 제네릭 타입입니다.


    3. 타입스크립트 제네릭타입의 응용

    1) extends 사용법

    extends 는 확장한다라는 의미로서, 이를 사용하면 타입에 제약을 걸 수 있습니다.

    interface LineNum {
    	length: number;
    }
    
    function getLen<T extends LineNum>(arg: T):T {
    	console.log(arg.length);
        return arg
    }

    LineNum 이라는 타입 인터페이스를 선언한 뒤에 이를 확장해서 getLen 의 제네릭 타입 T 에 적용시켰습니다.

    이렇게 되면 T 라는 타입은 최소한 LineNum 의 타입인터페이스를 포함하고 있어야합니다.!

    즉, 타입 T 는 객체로서, length 라는 프로퍼티를 가지고 있어야 한다는 거죠.

     

    2) 알아두면 좋은 우아한 사용법

    function getValue<T, K extends keyof T>(obj:T, key:K) {
    	return obj[key]
    }

    위 함수는 객체와  키를 인자로 받아 객체의 벨류를 리턴하는 함수입니다.

    원래 자바스크립트의 경우에는 key 값이 객체에 존재하지 않을 경우에 대한 예외처리를 hasproperty 를 통해 해주어야하는데 타입스크립트를 사용하면 이와같은 예외처리를 할 필요가 없습니다.!

    왜냐하면 K extends keyof T 가 자동으로 처리해주거든요 !

    K의 타입은 T라는 객체의 key 를 확장시킨것으로서, key 에는 T 라는 객체의 key 값만 들어갈 수 있습니다.!

Designed by Tistory.