1. typeof 로 타입 좁히기

function func(value: string | number | Date) {
  if (typeof value === "string") {
    value.toUpperCase();
  } else if (typeof value === "number") {
    value.toFixed(2);
  } else if (typeof value === "object") {
    // 이건 좀 위험해 보임
    // Date 라는 것을 보장받지 못함.
    value.getTime();
  }
}
const obj = [1, 2, 3];
func(obj);

2. instanceof 로 타입 좁히기

function func(value: string | number | Date) {
  if (typeof value === "string") {
    value.toUpperCase();
  } else if (typeof value === "number") {
    value.toFixed(2);
  } else if (value instanceof Date) {
    // Date 라는 것을 보장받음
    value.getTime();
  }
}
const obj = [1, 2, 3];
func(obj);

3. in 으로 타입 좁히기

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

function func(value: string | number | Date | null | Person) {
  if (typeof value === "string") {
    value.toUpperCase();
  } else if (typeof value === "number") {
    value.toFixed(2);
  } else if (value instanceof Date) {
    // Date 라는 것을 보장받음
    value.getTime();
    // } else if (value instanceof Person) { // 오류
    // } else if ("age" in value) { // 오류
    // } else if (value && "age" in value) { // 성공
  } else if (value as Person) {
    // 성공
    // 오류
    console.log((value as Person).age);
  }
}