조건부 타입 - 조건부 타입

조건부 타입

→ 주로 제네릭과 함께 쓰임

// 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로 추론됨