타입스크립트/타입스크립트 고급

연산자를 이용한 타입 정의

webmaster 2022. 10. 10. 23:09
728x90

Union Type

/*
function logMessage(value: any){
    console.log(value)
}

logMessage('hello')
logMessage(100) // any일 경우 가능
 */

function logMessage(value: string | number){ //유니온 타입 : 하나이상을 타입을 사용할 수 있다
    console.log(value)
}
logMessage('hello')
logMessage(100)
  • any를 사용해 하나 이상을 타입을 받을 수 있다.
  • | 연산자를 사용해 하나 이상을 타입을 받을 수 있고, 이를 유니온 타입이라고 한다.

Union Type의 장점

var seho: string | number | boolean
function logMessage(value: string | number){ //유니온 타입 : 하나이상을 타입을 사용할 수 있다
    if(typeof value === 'number'){
        //any 같은 경우 런타임 시 값이 정해져 API 속성을 사용할 수 없지만, typeof를 사용하게 된다면 해당 타입을 API를 사용할 수 있다.
        //타입 가드 : 타입을 필터링 하며 범위를 좁혀가는 과정
        value.toLocaleString()
    }
    if(typeof value === 'string'){
        value.toString()
    }
    throw new TypeError('value must be string or number')
}
logMessage('hello')
logMessage(100)
  • 타입 가드 : 타입을 필터링하며 범위를 좁혀가는 과정
  • any 같은 경우 런타임 시 타입이 추론이 되어 해당 타입의 API를 코드에 사용할 수 없지만, 타입 가드를 통해 범위를 좁혀서 해당 타입임이 명시가 되면 해당 타입의 API를 코드에 사용할 수 있다.

Union Type 특징


interface Developer {
    name: string;
    skill: string;
}

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

function askSomeone(someone: Developer | Person) {
    //someone에 접근할 수 있는 타입은 name 뿐이다. -> 교집합만 준다.
    //인터페이스를 여러개 쓰게 되면, 타입 safety 하게 사용하기 위해 공통적인 속성만 제공한다.
}
  • Developer/ Person 공통 속성 = name, Developer 개인 속성 : skill, Person 개인 속성 : age
  • 두개의 인터페이스를 유니온 타입으로 설정하게 되면, 타입 스크립트는 타입 안정성을 보장하기 위해(오류가 발생하지 않도록) 공통적이 속성 값만 사용할 수 있게 한다.
  • 여기서는 name 속성에만 접근할 수 있다.

인터섹션 타입 소개


var capt: string & number & boolean //인터섹션
function askSomeone(someone: Developer & Person) {
    //유니온 타입 같은 경우 타입 가드가 필요하지만, 인터섹션은 모두 포함이 되므로, 타입가드 필요 없이 사용이 가능하다
    someone.skill
    someone.age
}
  • & 연산자를 사용하여, 인터섹션 타입을 정의한다.
  • 인터섹션 같은 경우 해당 타입을 모두 만족하는 타입을 의미한다.
  • someone 같은 경우 Developer와 Person을 모두 만족하고 있으므로 skill, age 프로퍼티를 모두 다 가지고 있다고 가정하며, 타입 가드 없이 사용할 수 있다.

Union Type, 인터섹션 비교

function askSomeone(someone: Developer & Person) {

}

//유니온 타입 같은 경우 Developer 나 Person 만 규현되면 된다.
//askSomeone({name: '디벨로퍼', skill: '웹 개발'})
//askSomeone({name: '캡틴', age: 100})
askSomeone({name: '디벨로퍼', age: 100, skill: '웹 개발'}) //Developer 속성과 Person 속성 모두 가지는 타입을 써야한다
  • 유니온 타입은 유니온 타입으로 쓴 타입중 아무 거나 만 구현 되어 있으면 된다.
  • 인터섹션 같은 경우 인터섹션으로 쓴 타입중 모두 구현이 되어 있는 새로운 인터페이스를 작성해서 전달해야 한다.
728x90

'타입스크립트 > 타입스크립트 고급' 카테고리의 다른 글

제네릭  (0) 2022.10.11
클래스  (1) 2022.10.11
이넘  (0) 2022.10.10
타입 별칭  (0) 2022.10.10
인터페이스  (0) 2022.10.07