[TypeScript] Generic

2022. 7. 8. 17:43·TypeScript/기초
반응형
function func(x :unknown[]) {
    return x[0];
}

let a = func([4,2]);
console.log(a);

a를 출력하면 4가 출력될 것이다. 그렇다면 a의 타입은 뭘까? 

a의 타입은 number 타입이 아닌, unknown 타입이다. 파라미터의 타입이 unknown[] 이기 때문에 unknown 타입이 된다. 

 

function func(x :unknown[]) {
    return x[0];
}

let a = func([4,2]);
console.log(a + 1);

또한 이렇게 연산할 경우에도 에러가 난다. 

즉, 함수의 return 타입 지정을 number로 지정하기 전까지는 number타입으로 변하지 않는다. 

 

그런데, 타입스크립트를 사용하면 파라미터로 타입을 입력할 수 있는 Generic을 사용할 수 있다. 

 

Generic

function func<MyType>(x: MyType[]) :MyType {
    return x[0];
}

let a = func<number>([4,2])
let b = func<string>(['kim', 'park'])

함수에 <> 괄호를 열어 파라미터를 입력할 수 있다. 

예시의 func<number>() 이렇게 사용할 경우 MyType에는 number가 들어간다. 

즉, func(x: number[]) :number {} 랑 똑같이 동작한다고 보면 된다. 

 

Generic을 사용하면 원하는 타입을 return 값으로 받을 수 있는 함수를 쉽게 제작이 가능하다. 

 

function func<MyType>(x: MyType[]) :MyType {
    return x[0];
}

let a = func([4,2])
let b = func(['kim', 'park'])

함수를 사용할 경우 <>를 굳이 사용하지 않아도 어느 정도 기본 타입을 유추해서 넣어주기도 한다. 

 

-1의 오류 

Generic을 사용하더라도 return x - 1 같은 연산을 사용할 경우 에러가 난다. 

MyType이 number라면 문제가 없겠지만, number 외엔 다른 타입을 넣을 경우에 에러가 발생하기 때문이다. 

 

이럴 경우에는 narrowing을 사용하거나, Generic에 넣을 타입 자체를 제한하는 방법이 있다. 

 

Generic 타입 제한하기 

extends 문법을 사용하면 타입을 제한할 수 있다. 

function func<MyType extends number>(x: MyType) {
  return x - 1
}

let a = func<number>(100)

MyType extends number라고 사용하면 타입 파라미터에 넣을 수 있는 타입을 제한할 수 있습니다. 

반응형
저작자표시 비영리 변경금지 (새창열림)

'TypeScript > 기초' 카테고리의 다른 글

[TypeScript] React에서 사용하기_2편  (1) 2022.07.10
[TypeScript] React에서 사용하기_1편  (1) 2022.07.09
[TypeScript] Protected & Static  (1) 2022.07.07
[TypeScript] Public & Private  (1) 2022.07.07
[TypeScript] never 타입  (1) 2022.07.06
'TypeScript/기초' 카테고리의 다른 글
  • [TypeScript] React에서 사용하기_2편
  • [TypeScript] React에서 사용하기_1편
  • [TypeScript] Protected & Static
  • [TypeScript] Public & Private
잉여개발자
잉여개발자
풀스택 개발자를 목표로 잉여롭게 개발 공부도 하면서 다양한 취미 생활도 즐기고 있는 잉여 개발자입니다.
  • 잉여개발자
    잉여로운 개발일지
    잉여개발자
    • 분류 전체보기 (789)
      • 개발정보 (36)
      • 개발환경 (7)
      • 개발생활 (19)
      • React (141)
        • 이론 (23)
        • 기능 (12)
        • 실험실 (88)
        • 버그 (6)
        • 패스트캠퍼스 (9)
        • Npm (3)
      • React Native (28)
        • 공통 (6)
        • TypeScript (3)
        • JavaScript (18)
        • 버그 (1)
      • Next.js (30)
        • 이론 (13)
        • 실험실 (13)
        • 버그 (3)
      • Web (35)
      • 알고리즘 (202)
        • 풀이 힌트 (39)
      • JavaScript (47)
      • TypeScript (29)
        • 기초 (27)
        • 실험실 (2)
      • Node.js (13)
        • 이론 (0)
        • 기능 (3)
        • 실험실 (9)
        • 버그 (1)
      • 도커 (4)
      • CCNA (22)
        • 이론 (4)
        • 문제 (18)
      • 취미생활 (167)
        • 잉여로운 칵테일 (2)
        • 잉여의 식물키우기 (130)
        • 잉여로운 여행기 (11)
        • 잉여의 제2외국어 (21)
        • 잉여로운 책장 (2)
      • Java (1)
        • Java의 정석 (1)
      • 꿀팁 공유 (3)
  • 태그

    리액트
    typescript
    타입스크립트
    next.js
    ReactNative
    영어회화
    자바스크립트
    프로그래머스
    타일러영어
    CSS
    Node.js
    네이버 부스트캠프
    webpack
    리얼학습일기
    javascript
    Docker
    영어독학
    redux
    식물
    네트워크
    바질 키우기
    덤프
    바질
    리얼클래스
    Babel
    ChatGPT
    다이소
    react
    CCNA
    알고리즘
  • hELLO· Designed By정상우.v4.10.1
잉여개발자
[TypeScript] Generic
상단으로

티스토리툴바