
function logMessage(value:string | number) {
console.log(value);
}
logMessage('hello');
logMessage(100);
타입을 하나 더 추가하고 싶을때 | 를 추가하고 타입을 입력한다.
| 는 타입스크립트에서 유니온 타입(Union type) 이라고 하고, 유니온 타입은 하나 이상의 타입을 정의하고 싶을때 사용한다.let seho: string | number | boolean;
function logMessage(value:string | number) {
if(typeof value === 'number' ) {
value.toString()
}
if( typeof value === 'string' ) {
value.toLocaleLowerCase()
}
throw new TypeError('value must be string or number');
// 유니온타입 속성을 이용해서 에러 string과 number가 아닌 경우에 TypeError를 출력할 수 있음.
}
any의 경우 any로 되어 있기 때문에 타입스크립트가 추론하는 시점에서 타입을 정의할 수 없어서 변수에 대한 api의 속성들을 확인할 수 없다.유니온타입에 경우 해당 타입에 맞게 api를 바로 확인하고 사용할 수 있다.interface Developer {
name:string;
skill:string;
}
interface Person {
name:string;
age:number;
}
function askSomeone(someone: Developer | Person) {
someone.age // x
someone.skill // x
someone.name // o
}
유니온타입은 인터페이스 두개를 연결했을때 공통적인 속성만 접근할 수 있다.
- 에러의 위험이 있기때문에 공통된, 보장된 속성만 제공
공통된 속성에 접근하고 싶다면 타입가드를 이용해 특정 타입으로 제한한 뒤 접근해서 걸러내는 방식으로 하는것을 추천한다.
let capt: string & number & boolean; // x never
string, number, boolean을 모두 만족하는 타입
function askSomeone(someone: Developer & Person) {
someone.skill
someone.age
someone.name
}
function askSomeone(someone: Developer & Person)function askSomeone(someone: Developer | Person) { }
askSomeone({name: '디벨로퍼', skill: '웹 개발' }); // Developer
askSomeone({name: '펄슨', age: 100 }); // Person
Developer나 Person의 규격에 맞게 호출시 데이터를 넘겨주면 된다.
상대적으로 인터섹션 타입보다 유니온 타입이 많이 쓰인다.
function askSomeone(someone: Developer & Person) {
someone.skill
someone.age
someone.name
}
askSomeone({name: '디벨로퍼', skill: '웹 개발' }); // error
askSomeone({name: '펄슨', age: 100 }); // error
askSomeone({name: '디벨로퍼', skill: '웹 개발', age: 100 }); // success
유니온타입처럼 데이터를 넘겨줄 경우 error가 발생

프리뷰를 보면 Developer 와 Person의 속성이 합한 객체를 넘겨달라는 메세지가 나온다.
유니온 타입의 경우 함수 내부에서 타입가드, 타입 추론을 실행해야하는 작업이 있는 반면에, 실제로 넘기는 타입에 대해서는 선택지가 생긴다.인터섹션의 경우에는 두개 타입을 모두 포함하는 새로운 타입을 만들게 되는다는 차이점이 있다.