TypeScript의 join 함수에 대해 알아보도록 하겠습니다.
interface User {
name: string;
age: number;
}
function join (name: string, age: number | string): User | string {
if (typeof age === 'number') {
return {
name,
age,
};
} else {
return '나이를 숫자로 입력해 주세요.';
}
}
const kim: User = join('Kim', 30); --- (1)
const lee: string = join('Lee', '20'); --- (2)
join 함수를 보면 age가 number 면 User
를 반환하고 age가 string 이면 string인 '나이를 숫자로 입력해 주세요.'
을 반환합니다. 함수만 보면 정상 동작을 할 거 같지만 (1) 번과 (2) 번을 입력하면 kim
과 lee
에서 error가 발생합니다.
함수에서는 error가 발생하지 않는데 왜 error가 발생할까요?
그 이유는 kim
이 User 객체를 반환하는데 확신이 없기 때문입니다. 이와 같은 이유로 lee
도 string으로 반환하는데 확신이 없기에 error가 발생하는 것입니다.
이를 해결하기 위해서는 오버로드 사용해 줍니다.
함수 오버로드는 전달받은 매개변수의 개수나 타입에 따라 다른 동작을 실행하게 합니다.
interface User {
name: string;
age: number;
}
function join (name: string, age: number): User;
function join (name: string, age: string): string;
function join (name: string, age: number | string): User | string {
if (typeof age === 'number') {
return {
name,
age,
};
} else {
return '나이를 숫자로 입력해 주세요.';
}
}
const kim: User = join('Kim', 30); // { name: 'Kim', age: 30 }
const lee: string = join('Lee', '20'); // 나이를 숫자로 입력해 주세요.
이처럼 동일한 함수에서 매개변수의 개수나 타입에 따라서 다르게 동작해야 한다면 본래의 함수 위에 오버로드를 작성해 주면 됩니다.