Call Signature(Overloading)

동일한 이름에 매개 변수와 매개 변수 타입 또는 리턴 타입이 다른 여러 버전의 함수를 만드는 것을 말합니다. TypeScript에서는 오버로드 signatures을 작성하여 "다양한 방식으로 호출할 수 있는 함수"를 지정할 수 있습니다

overloading의 개념은 객체지향에서 상속된 클래스의 메소드에서, 메소드의 이름은 동일하지만 return 값의 타입이나 parameter의 타입과 개수를 달리하여 새로운 메소드를 여러개 정의하는 개념과 같습니다.

<aside> 💡 What is call signature? (호출 서명이란 무엇입니까?)

함수의 인수 및 반환 값의 유형입니다.

</aside>

Overloading exam 1

type Add = {
	(a: number, b: number): number
	(a: number, b: string): number
}
// ==
type Add = {
	(a: number, b: number | string): number
}

const add: Add = (a, b) => {
	if(typeof b === 'string') return a;
	return a + b;
}

Overloading exam 2

type Config = {
	path: string
	state: object
}

type Push = {
	(path: string): void
	(config: Config): void
}

const push: Push = (config) => {
	if(typeof config === 'string') console.log(config)
	else console.log(config.path, config.state)
}

Overloading exam 3

type Add = {
	(a: number, b: number, c: number): number
	(a: number, b: number): number
}
// ==
type Add = (a: number, b: number, c?: number) => number;

const add: Add = (a, b, c?: number) => {
  if (c !== undefined) return a + b + c;
	return a + b;
}