타입스크립트 입문한 지 얼마 안 됐는데 신기한 걸 봤어요. 함수 파라미터를 string | number 이렇게 유니온으로 받았는데 if로 체크하니까 그 안에서는 타입이 딱 하나로 정해지더라고요. 이게 뭔지 궁금해요.
이런 코드예요.
function print(value: string | number) {
// 여기선 value가 string | number
if (typeof value === "string") {
console.log(value.toUpperCase()); // 여기선 string으로 됨
} else {
console.log(value.toFixed(2)); // 여기선 number로 됨
}
}
if 밖에서 value.toUpperCase() 하면 빨간 줄 뜨는데 typeof로 체크한 블록 안에서는 에러가 안 나요. 에디터에서 마우스 올려보면 타입이 바뀌어 있고요. 이게 말로만 듣던 narrowing인가요?
근데 객체일 때는 어떻게 하는지 모르겠어요. 예를 들어 이렇게 두 종류 객체를 유니온으로 받으면요.
type Cat = { meow: () => void };
type Dog = { bark: () => void };
이럴 땐 typeof로는 구분이 안 되잖아요. in 연산자 쓰라는 것도 봤고 뭐 판별 유니온인가 그런 것도 있다던데 이런 경우엔 어떻게 좁히는 게 정석인지 알려주시면 좋겠어요.