TypeScript #8 | 함수 (3) - Polymorphism, Generic

HyeonWooGa·2022년 8월 28일
0

TypeScript

목록 보기
9/16

Polymorphism (다형성)

개요

  • Generic

정의

  • 'poly' 많은, 다수의 + 'morphos' 형태, 구조
  • 여러가지 다른 모양을 가지고 있는 성질

코드 예시

배열의 모든 요소를 프린트하는 함수 생성 (타입 상관 X)


type SuperPrint = {
  (arr: number[]): void
  (arr: boolean[]): void
}

const superPrint: SuperPrint = (arr) => {
  arr.map(v => console.log(v));
}

superPrint([1, 2, 3, 4]);
superPrint([true, false, true]);
superPrint(["1", "2", "3", "4"]);	// 에러 발생
  • 의문점 1
    • 위의 코드에서 에러 발생한 부분을 해결하기 위해서 (arr: string[]): void 호출 시그니쳐를 추가하는 것이 좋은 방법일까요?

type SuperPrint = {
  (arr: number[]): void
  (arr: boolean[]): void
  (arr: string[]): void
}

const superPrint: SuperPrint = (arr) => {
  arr.map(v => console.log(v));
}

superPrint([1, 2, 3, 4]);
superPrint([true, false, true]);
superPrint(["1", "2", "3", "4"]);
superPrint([1, 2, true, false]);	// 에러 발생
  • 의문점 2
    • 위의 코드에서 에러 발생한 부분을 해결하기 위해서 (arr: (number|boolean)[]): void 호출 시그니쳐를 추가하는 것이 좋은 방법일까요?

제네릭 (Generic)

개요

  • 함수가 다형성을 가질때 발생할 수 있는 위의 의문점, 문제들을 해결하기 위해 사용합니다.

정의

  • C# 이나 Java 와 같은 언어에서 재사용 가능한 컴포넌트 만들기 위해 사용하는 기법입니다.
  • 선언 시점이 아니라 생성 시점에 타입을 명시하여 하나의 타입만이 아닌 다양한 타입을 사용할 수 있도록 하는 기법입니다.
  • 타입의 placeholder 와 같습니다.

사용하는 이유

  • 단일 타입이 아닌 다양한 타입에서 작동할 수 있는 컴포넌트를 생성할 수 있습니다.
  • call signature 작성할 때 인자의 확실한 타입을 모르는 경우에 사용합니다.
  • any 를 사용하는 것과는 근본적으로 다르게 동작합니다.
    • 제네릭은 call signature 를 추정해서 생서해주지만, any 는 아무것도 하지 않습니다.

사용법 (복수 제네릭 가능)

  1. 타입스크립트에 generic 을 사용한다고 알려줍니다. (꺽쇠 <> 사용)
  2. 제네릭을 사용하고 싶은 곳에 제네릭을 선언해줍니다.
  3. 제네릭에 해당하는 부분은 타입스크립트가 추정한 값으로 자동으로 대체됩니다.


profile
Aim for the TOP, Developer

0개의 댓글