삼항연산자를 이용해서 조건에 따라 타입을 결정한다.
type A = number extends string ? string : number; // number타입
type ObjA = {
a: number;
};
type ObjB = {
a: number;
b: number;
};
type B = ObjB extends ObjA ? string : number; // number타입
참고: 제네릭타입 형태
type StringNumberSwitch<T> = T extends number ? string : number; let varA: StringNumberSwitch<number>; // string let varB: StringNumberSwitch<string>; // number
function removeSpaces(text: string) {
return text.replaceAll(" ", "");
}
let result = removeSpaces("hi im winterlood"); //"hiimwinterlood"
result.toUpperCase();
text
의 타입에 undefined
와 null
값을 추가하면 다음과 같은 오류가 발생한다.function removeSpaces(text: string | undefined | null) {
return text.replaceAll(" ", ""); //❌오류 →string메서드 사용불가
}
let result = removeSpaces("hi im winterlood"); //"hiimwinterlood"
result.toUpperCase();
result
변수 타입이 string|undefined
로, 문자열 메서드 사용이 불가해 오류 발생function removeSpaces(text: string | undefined | null) {
if (typeof text === "string") {
return text.replaceAll(" ", "");
} else {
return undefined;
}
}
let result = removeSpaces("hi im winterlood");
result.toUpperCase(); //❌오류 →string메서드 사용불가
function removeSpaces<T>(text: T): T extends string ? string : undefined {
if (typeof text === "string") {
return text.replaceAll(" ", ""); //❌오류
} else {
return undefined; //❌오류
}
}
let result = removeSpaces("hi im winterlood"); //✅
result.toUpperCase(); //✅
let result2 = removeSpaces(undefined); //✅
type StringNumberSwitch<T> = T extends number ? string : number;
let varA: StringNumberSwitch<number>;
let varB: StringNumberSwitch<string>;
function removeSpaces<T>(text: T): T extends string ? string : undefined {
if (typeof text === "string") {
return text.replaceAll(" ", "") as any; //👈
} else {
return undefined as any; //👈
}
}
let result = removeSpaces("hi im winterlood");
result.toUpperCase();
let result2 = removeSpaces(undefined);
function removeSpaces<T>(text: T): T extends string ? string : undefined; //👈
function removeSpaces<T>(text: any) {
if (typeof text === "string") {
return text.replaceAll(" ", "");
} else {
return undefined;
}
}
let result = removeSpaces("hi im winterlood");
result.toUpperCase();
let result2 = removeSpaces(undefined);
string
타입이 아닌 타입을 반환할 때 문제 감지undefined
이 아닌 값을 반환할 때 문제 감지