TS

TS 03 overloading, Polymorphism, generic

와라리요 2023. 1. 31. 11:00

overloading

 - 서로 다른 여러 개의 call dignature를 가지고 있는 것을 overloading이다. 직접 사용하는 것은 드물고 라이브러리, 프레임워크를 만들 때 대부분 사용이 된다.

 

type Add = {
  (a: number, b: number): number
  (a: number, b: string): number
}

const add: Add = (a, b) => {
  if (typeof b === "string") return a
  return a + b;
}

 

파아미터의 개수가 다를 때 인자 선언하기

 - 여러가지 상황을 고려하여 파라미터들을 구성해 추가적으로 +된 overloading이 있다면 오류가 발행하는 상황이 있다. 그럴때는 인자에 ?와 타입을 선언하면 된다.

 

type Add () = {
  (a: number, b: number): number
  (a: number, b: number, c:number): number
}

const add: Add = (a, b, c?: number) => [
  if (c) return a + b + c;
  return a + b;
}

 

 


Polymorphism (다형성)

generic

 - 타입을 미리 정하는 것이 아닌 인자로 받는 값에 맞게 타입을 자동으로 지정해 준다. 타입이 없는 것이 아닌 각 인자마다의 타입을 자동으로 선언해 주는 것이다!!

    사용하는 방법은 인자로 받을 타입 앞에 <>로 generic를 선언할 것을 알려주고 <> 안에 단어를 넣는다. 그 후 메소드 뒤에 단어를 선언해주면 된다.

 

function print<T>(a: T) {
  return a;
}

// 다양한 타입을 자동으로 선언한다.
print([1, 2, 3]);
print(['a', 'b', 'c']);
print([1, 'a', 2, 'b']);

 

//overloading을 함께 적용하면

//리턴 값이 없을 때
type Print = {
  <T>(arr: holder[]): void
}

const print: T = (arr) => {
  arr.forEach(e => console.log(e));
}

// 전부 정상 작동이 되며 각 타입에 맞게 선언이 되어 있음.
print([1, 2, 3]);
print(['a', 'b', 'c']);
print([1, 'a', 2, 'b']);

//리턴 값이 있을 때

type Print = {
  <T>(arr: holder[]): T
}

const print: T = (arr) => arr[0];