프론트엔드/Typescript

[타입스크립트] 제네릭 - 2 (타입 제한)

zzocco94 2023. 1. 12. 17:54

제네릭 타입 제한 

1. 배열

  • 함수 호출 시 타입을 명시하지 않을 경우, 아래처럼 에러가 날 수 있음
    function logTextLength<T>(text: T): T {
      console.log(text.length); // error! T에 length 프로퍼티가 없다
      return text;
    } 
    logTextLength('hi');

 

  • T → T[] 배열로 바꾸면 length 프로퍼티를 사용할 수 있음
    function logTextLength<T>(text: T[]): T[] {
      console.log(text.length); 
      return text;
    } 
    logTextLength(['hi', 'abc']);

2. 정의된 타입

  • extends를 이용해 LengthType을 상속하면 length 프로퍼티를 기본으로 갖고, 더 추가할 수 있다
    interface LengthType {
      length: number;
    }
    function logTextLength<T extends LengthType>(text: T): T {
      console.log(text.length);
      return text;
    }
    logTextLength('a'); // ok
    logTextLength(10); // Error! number는 내부에 length 속성이 없음
    logtextLength({ length: 10 }); // ok
    logtextLength({ test: 10 }); // Error! test라는 속성이 없음

3. keyof

  • 파라미터가 ShoppingItem의 키만 받을 수 있도록 제한하기 (’name’ || ‘price’ || ‘stock’)
    interface ShoppingItem {
      name: string;
      price: number;
      stock: number;
    }
    function getShoppingItemOption<T extends keyof ShoppingItem>(itemOption: T): T {
      return itemOption;
    }
    getShoppingItemOption(10); // Error!
    getShoppingItemOption<string>('a'); // Error!
    getShoppingItemOption('name'); // ok 

 

출처 : 인프런 '타입스크립트 입문 - 기초부터 실전까지' 강의를 듣고 정리한 글입니다.