본문 바로가기
개발언어/TypeScript

제네릭 <Generic>

by Ligion 2021. 4. 15.

 

function checkNull(arg: number | null): number {
  if (arg == null) throw new Error('앗 널이다!!');
  return arg;
}

 

null을 체크하는 함수이다. 파라미터로 number 혹은 null 타입을 받고 있다.

리턴도 넘버타입이다.

 

그럼 string은? boolean은? 혹은 내가 만든 타입이라면???

 

function checkNull(arg: any | null): any {
  if (arg == null) throw new Error('앗 널이다!!');
  return arg;
}

 

any타입으로 만들어보았다. 리턴도 any타입이다.

이제 문제가 없다. 재사용성이 향상됐으니까.

 

function checkNull(arg: any | null): any {
  if (arg == null) throw new Error('앗 널이다!!');
  return arg + '1';
}

const num = checkNull(10);

 

num은 number타입일까? string타입일까?

답은 그냥 any이다. 콘솔로 출력하면 '101'이다. 

그렇다. any로 만들면 타입이 보장되지않는다.

 

제네릭이 필요하다.

 

function checkNull<T>(arg: T | null): T {
  if (arg == null) throw new Error('앗 널이다!!');
  return arg;
}

함수명 옆에 <>를 추가하고 <>안과 parameter type, return type에 T라는 type을 넣었다.

T에는 뭘 넣어도 상관없지만 대문자 알파벳 하나를 넣는 것이 관례이다.

 

타입추론을 통해 number 타입이 보장되는 것을 확인할 수 있다.


Class Generic

 

interface Either<L, R> {
  left: () => L;
  right: () => R;
}

class SimpleEither<L, R> implements Either<L, R> {
  constructor(private leftValue: L, private rightValue: R) {}
  left(): L {
    return this.leftValue;
  }

  right(): R {
    return this.rightValue;
  }
}
const either: Either<number, number> = new SimpleEither(4, 5);
either.left();  // 4
either.right(); // 5

실용성은 없지만 제네릭 클래스를 이해하기에 좋은 예제이다.

 

'개발언어 > TypeScript' 카테고리의 다른 글

유틸리티 타입 (Utility Types)  (0) 2021.04.16
type과 interface 차이  (0) 2021.04.16
타입스크립트의 객체지향  (0) 2021.04.15
타입 단언 (Type Assertions)  (0) 2021.04.12
타입 추론 (Type Inference)  (0) 2021.04.12

댓글