Frontend/TypeScript
[TypeScript] TypeScript 공부일지: 사용자 정의 타입가드 [6/12 study]
동혁이
2024. 6. 12. 23:26
TypeScript 공부일지: 사용자 정의 타입가드
❗️주의
지극히 개인 공부한 내용을 올린 거기 때문에 이해하지 못할 수도 있음
❗️사용자 정의 타입가드
/**
* 사용자 정의 타입가드
*/
type Dog = {
name: string;
isBark: boolean;
};
type Cat = {
name: string;
isScratch: boolean;
};
type Animal = Dog | Cat;
function isDog(animal: Animal): animal is Dog {
// 원래 이건데 animal.isBark !== undefined; 타입이 잘안좁혀지므로 타입 단언하면됨
// 하지만 TS는 함수의 반환값을 가지고는 타입을 잘 좁혀주지 않음
// 이럴때는 함수 자체를 타입 가드 역할을 하도록 만듬 이 함수의 반환값의 타입으로 true 일때
// animal is Dog (is 타입을 쓰면 return 값이 true면 animal을 Dog 타입으로 보라! 이런 느낌)
// 'as' 키워드란 요약하자면 '컴파일' 단계에서 타입 검사를 할 때 타입스크립트가 감지하지 못하는
// 애매한 타입 요소들을 직접 명시해주는 키워드라고 볼 수 있다
return (animal as Dog).isBark !== undefined;
}
function isCat(animal: Animal): animal is Cat {
return (animal as Cat).isScratch !== undefined;
}
function warning(animal: Animal) {
// 원래 "isBark" in animal 이거였음 프로퍼티 이름을 기준으로 타입을 좁히면 직관적으로 별로 안좋고 프로퍼티 이름이 중간에 바뀌기라도 한다면
// 타입이 제대로 좁혀지지도 않음
// 이럴때 사용하는게 사용자 정의 타입가드임
if (isDog(animal)) {
animal;
// 강아지
} else if ("isScratch" in animal) {
animal;
// 고양이
}
}