→ 주로 제네릭과 함께 쓰임
// number 타입은 string타입을 확장하는 타입이냐?
type A = number extends string ? string : number; //false여서 number됨
type ObjA = {
a: number;
}
type ObjB = {
a: number;
b: number;
}
type B = ObjB extends ObjA ? number : string; // true여서 number타입 됨
type StringNumberSwitch<T> = T extends number ? string : number;
let varA : StringNumberSwitch<number>; // 이런식으로 varA는 위 조건에 따라 string 타입이 됨
function removeSpaces<T>(text : T) : T extends string ? string : undefined;
function removeSpaces<T>(text : any){
if(typeof text === 'string'){
return text.replaceAll(" ", "") // 함수 내부에서는 T를 unknown으로 보기에 오버로딩 통해 해결
} else{
return undefined
}
}
let result = removeSpaces("hi im parkjeongsu"); // 반환 타입이 string으로 추론됨
result.toUpperCase();
let result2 = removeSpaces(undefined); // 반환 타입이 undefined로 추론됨