728x90
interface Developer {
name: string;
skill: string;
}
interface Person {
name: string;
age: number;
}
//Developer도 반환할 수 있고, Person도 반환할 수 있다.
function introduce(): Developer | Person {
return {name: 'Tony', age: 33, skill: 'Iron Marking'}
}
var tony = introduce() // Developer, Person 모두 받을 수 있는 타입
//console.log(tony.skill) //skill이 없다고 나온다, -> 공통된 속성만 접근할 수 있기 때문에
if ((tony as Developer).skill) { //타입 단언을 통해 skill에 접근할 수 있다.
console.log((tony as Developer).skill) //내부 코드, 외부 코드에서 접근할 때마다 타입 단언을 선언해야한다
} else if ((tony as Person).age) {
console.log((tony as Person).age)
}
- Developer와 Person을 유니온 타입으로 반환하는 introduce를 선언하고, 공통적인 부분을 반환한다.
- 반환하는 Json에서는 분명 skill과 age가 있지만, 사용하는 곳 tony에서는 skill과 age가 없다.
- why? 유니온 타입에서 반환되는 값은 공통된 속성만 제공하기 때문에
- 타입 단언을 통해 접근할 수 있지만, 매번 사용할 때마다, 타입 단언 문법이 들어가기 때문에 번거롭다(잘 사용하지 않는다)
타입 가드
interface Developer {
name: string;
skill: string;
}
interface Person {
name: string;
age: number;
}
function introduce(): Developer | Person {
return {name: 'Tony', age: 33, skill: 'Iron Marking'}
}
var tony = introduce()
//타입 가드 정의
function isDeveloper(target: Developer | Person): target is Developer {
return (target as Developer).skill !== undefined //skill이 있다
}
if (isDeveloper(tony)) {
console.log(tony.skill) //tony가 Developer의 skill 접근 가능
} else {
console.log(tony.age) //그렇지 않으면 Person의 age 접근 가능(Person 타입)
}
- 타입 가드를 사용하면, 매번 타입 단언하던 코드가 사라진다.
- isDeveloper가 true이면 tony는 Developer 타입이 되고, skill에 접근이 가능하다.
- 그렇지 않으면 tony는 Person 타입이 되고, age에 접근이 가능하다.
728x90