본 포스트는 인프런의 타입스크립트 입문-기초부터 실전까지 강의(링크)를 듣고 정리한 내용입니다.


2개 이상의 type을 지정하고 싶은 경우

function logMessage(value: string | number): void {
  console.log(value);
}
logMessage('hello');
logMessage(100);

|(pipe; or 표시) 사용


특정 타입으로 타입의 범위를 좁혀나가는(필터링 하는) 과정

imageimage
  • if문을 사용하여 특정 type인 경우를 조건으로 한다면, if문 내부에서 해당 type의 메서드 사용 가능
  • Union Type의 장점

function logMessage(value: string | number): string {
  if (typeof value === 'number') {
    return value.toLocaleString();
  }
  if (typeof value === 'string') {
    return value.toString();
  }
  throw new TypeError('value must be string or number')
}
  • type guard를 통해서 여러 개의 type 내에 해당하지 않는 type인 경우
  • throw new TypeError(ErrMsg)를 통해 TypeError 발생

여러 interface의 공통 속성에 대해서만 VS Code IntelliSense

interface Developer {
  name: string;
  skill: string;
}
 
interface Person {
  name: string;
  age: number;
}
  • 이러한 두 interface를 만들고, Union Type으로 인자를 받으면 아래와 같다.
image

만약 각각의 interface의 고유한 속성을 사용하고 싶다면?

type guard를 이용해 type을 특정하여 if문 내부에서 사용


function askSomeone(someone: Developer & Person): void {
  ...
}
  • Union Type과 비교되는 Intersection Type인 & 문자로 연결
  • someone에 점을 찍으면 아래와 같은 결과
image
  • 두 interface의 속성을 모두 사용 가능
  • 의미상 someone 인자는 Developer와 Person interface가 가지는 모든 속성과 type을 포함하는 type

Union Type

함수에 전달하는 객체 인자의 세부 타입이 다른 경우에도 모두 수용

interface Developer {
  name: string;
  skill: string;
}
 
interface Person {
  name: string;
  age: number;
}
 
function askSomeone(someone: Developer | Person): void {}
askSomeone({ name: '디벨로퍼', skill: '웹 개발' })
askSomeone({ name: 'hulk', age: 50})
  • 전달되는 객체 인자의 속성 type에 따라 interface를 다르게 인식하여 오류 발생 X

Intersection Type

지정된 interface의 모든 속성과 type을 함수에 전달하는 객체 인자가 가져야 함

function askSomeone(someone: Developer & Person): void {}
askSomeone({ name: '디벨로퍼', skill: '웹 개발', age: 25 })
  • 즉, intersection은 여러 interface(type)을 합친 새로운 하나의 interface(type) 역할