타입스크립트 - 타입스크립트 - overloading
1
2
3
4
5
// Error!
// Operator '+' cannot be applied to types 'string | number' and 'string | number'.(2365)
function add(x: string | number, y: string | number): string | number {
return x + y;
}
위와 같은 타입 오류를 해결하는 방법?
함수 오버로딩
- 호출할 수 있는 함수의 타입을 미리 여러개 타이핑해두는 기법
작성방법
- 타입만 작성하고 구현부를 작성하지 않고 여러개의 함수를 작성하고
- 마지막에 함수 구현부를 작성할 때 매개변수를 any로 지정하거나 위에 선언해둔 타입을 작성
- any로 지정해도 위에 선언해둔 타입만 들어올 수 있음
매개변수가 다를 때의 함수 오버로딩
1
2
3
4
5
6
7
8
function add(a: string, b: string): string;
function add(a: number, b: number): number;
function add(a: any, b: any): any {
return a + b;
}
add("hello", "world"); // function add(a: string, b: string): string (+1 overload)
add(1, 3); // function add(a: number, b: number): number (+1 overload)
매개변수가 다를 때의 함수 오버로딩 2
매개변수로 전달받은 string과 string 배열을 하나의 string으로 리턴하는 함수
1
2
3
4
5
6
7
8
9
// 매개변수에 직접적으로 타입 지정하기
function saySomeThing1(word: string | string[]): string {
if (typeof word === "string") return word;
if (Array.isArray(word)) return word.join(" ");
throw new Error("unable to say something");
}
saySomeThing1(["안녕하세요", "World"]); // '안녕하세요 World'
매개변수에 직접적으로 타입을 지정할 수 있으나, 여러가지의 타입을 할당한다면 코드가 복잡해짐
1
2
3
4
5
6
7
8
9
10
11
// 함수 오버로드 사용
function saySomeThing2(word: string): string;
function saySomeThing2(word: string[]): string;
function saySomeThing2(word: any): any {
if (typeof word === "string") return word;
if (Array.isArray(word)) return word.join(" ");
throw new Error("unable to say something");
}
saySomeThing2(["안녕하세요", "World"]); // '안녕하세요 World'
오버로딩이 동시에 해당될 수 있는 경우 제일 먼저 선언된 오버로딩에 해당됨
1
2
3
4
5
6
7
8
9
10
11
function example(param: string): string;
function example(param: string | null): number;
function example(param: string | null): string | number {
if (param) {
return "string";
} else {
return 1234;
}
}
const result = example("what");
// const result: string
- 오버로딩 순서를 변경하면 number가 출력됨
1
2
3
4
5
6
7
8
9
10
11
function example(param: string | null): number;
function example(param: string): string;
function example(param: string | null): string | number {
if (param) {
return "string";
} else {
return 1234;
}
}
const result = example("what");
// const result: number
타입 별칭으로 오버로딩 작성하기
각자 함수 타입을 선언하고, &
연산자로 하나로 묶기
1
2
3
4
type Add1 = (x: number, y: number) => number;
type Add2 = (x: number, y: number) => number;
type Add = Add1 & Add2;
const add: Add = (x: any, y: any) => x + y;
This post is licensed under CC BY 4.0 by the author.