본 포스트는 인프런의 타입스크립트 입문-기초부터 실전까지 강의(링크)를 듣고 정리한 내용입니다.
2개 이상의 type을 지정하고 싶은 경우
function logMessage(value: string | number): void { console.log(value); } logMessage('hello'); logMessage(100);
|(pipe; or 표시) 사용
특정 타입으로 타입의 범위를 좁혀나가는(필터링 하는) 과정
- 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으로 인자를 받으면 아래와 같다.
만약 각각의 interface의 고유한 속성을 사용하고 싶다면?
type guard를 이용해 type을 특정하여 if문 내부에서 사용
function askSomeone(someone: Developer & Person): void { ... }
- Union Type과 비교되는 Intersection Type인 & 문자로 연결
- someone에 점을 찍으면 아래와 같은 결과
- 두 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) 역할
