몽땅뚝딱 개발자

[TypeScript] 유니온 타입 vs 인터섹션 타입 본문

Development/Typescript

[TypeScript] 유니온 타입 vs 인터섹션 타입

레오나르도 다빈츠 2022. 6. 6. 16:03

 

◽ 유니온 타입

여러가지의 타입을 파이브로 연결하여 지정할 수 있다.

// 변수에 사용하기
const user = string | number

// 함수에 사용하기
function logMessage(value: string | number) {
  console.log(value);
}
logMessage('hello')
logMessage(10)

 

📄 예제

// 유니온 타입
function logMessage(value: string | number) {
  if(typeof value === 'number') {
    value.toLocaleString()
  }

  if(typeof value === 'string') {
    value.toString()
  }

  throw new TypeError('value must be string or number')
}

 

 

◽ 유니온 타입의 특징

두가지의 인터페이스를 사용한다고 선언했더라도 선언된 모든 속성을 사용할 수는 없다.

interface Developer {
  name: string;
  skill: string;
}
interface Person {
  name: string;
  age: number;
}

function askSomeone(someone: Developer | Person) {
  someone.name // 이 공통된 속성만 접근할 수 있으며
  someone.skill // 이 타입은 불가
  someone.age // 이 타입은 불가
}

 

 

 

◽ 유니온 타입의 문제점

두가지 타입을 지정하기때문에 타입이 정확하지않아서 아래와 같은 에러가 뜬다.

타입을 받은 상황에서 자동완성은 교집합만 제공한다.

 

 

 

◽ 인터섹션 타입

인터섹션 타입은 여러 타입을 모두 만족하는 하나의 타입이다.

유니온은 '|'(=파이프)로 연결했다면 인터섹션은 '&'로 연결한다.

interface Developer {
  name: string;
  skill: string;
}
interface Person {
  name: string;
  age: number;
}

function askSomeone(someone: Developer & Person) {
  someone.name
  someone.skill
  someone.age
}

 

 

 

◽ 유니온 타입 vs 인터섹션 타입

 

📄 유니온

각 인터페이스의 속성이 개별적으로 필요하다.

function askSomeone(someone: Developer | Person) {
  // ...
}

askSomeone({ name: '디벨로퍼', skill: '웹 개발' })
askSomeone({ name: '디벨로퍼', age: 10000 })

 

📄 인터섹션

각 인터페이스가 가진 모든 속성을 포함해야 한다.

function askSomeone(someone: Developer & Person) {
   // ...
}

askSomeone({ name: '디벨로퍼', skill: '웹 개발', age: 10000 })

 

 


 

 

출처

 

타입스크립트 입문 - 기초부터 실전까지 - 인프런 | 강의

타입스크립트를 시작하는 분들을 위한 강의입니다. 최신 자바스크립트 문법을 모르는 분들도 쉽게 배울 수 있도록 교과 과정을 구성하였습니다. 어렵게만 느껴지는 타입스크립트를 입문자 관

www.inflearn.com

 

'Development > Typescript' 카테고리의 다른 글

[TypeScript] 제네릭(Generic) - 다시보기  (0) 2022.06.06
[TypeScript] 이넘(Enum)  (0) 2022.06.06
[TypeScript] 인터페이스  (0) 2022.06.06
[TypeScript] 변수와 함수의 타입 정의  (0) 2022.06.06
[Typescript] playground  (0) 2022.06.06
Comments