타입 좁히기 - 타입스크립트 이해하기

/**
 * 타입 좁히기
 * 조건문 등을 이용해 넓은타입에서 좁은타입으로
 * 타입을 상황에[ 따라 좁히는 방법을 이야기
 */

type Person = {
    name: string;
    age: number;
};

// value => number : toFixed
// value => string : toUpperCase
// value => Date : getTime
// value => Person : name은 age살 입니다.
function func(value: number | string | Date | null | Person){
    value;
    // value.toUpperCase(); 에러
    // value.toFixed(); 에러

    if(**typeof value === 'number'**){
        console.log(value.toFixed())
    }
    else if(typeof value === 'string'){
        console.log(value.toUpperCase())
    }
    else if (**value instanceof Date**){ // 해당 객체가 맞는지 확
        console.log(value.getTime())
    }
    // else if(value instanceof Person){ // 여기서 타입이 오면 안됨 (객체만 가능)

    // }
    else if(**value && "age" in value**){ // value가 null일 수도 있다는것을 방지하고 age가 value에 있냐?를 판단
        console.log(`${value.name}은 ${value.age}살 입니다.`)
    }
}