콜 시그니쳐 (call signatures)
함수의 매개변수와 반환 값의 타입을 모두 type으로 미리 선언하는 것
function add(a:number, b:number) {
return a + b;
}
// call signatures가 적용된 add
type Add = (a:number, b:number) => number
const addCall:Add = (a, b) => a + b
오버로딩(Oveerloading)
함수가 여러개의 call signatures나 파라미터의 개수가 다를 경우를 가지고 있을 때 발생
언제 많이 사용되는가?
패키지나 라이브러리 또는 Next.js(객체형)에서 오버로딩을 많이 사용
1) 여러개의 Call Signatures를 가지고 있을 경우
type Add1 = {
(a:number, b:number)
(a:number, b:string)
}
const add1: Add1 = (a, b) => a + b // error
// 이 경우, b가 string or number 여서 더할 수 없다.
따라서 ->
const add1: Add1 = (a, b) => {
if(typeof b === 'string') return a
return a + b
}
// if문으로 분기를 나눠주면 OK.
2) 객체 형태인 여러개의 Call Signatures를 보낼 경우
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)}
}
// config의 타입이 string일 경우 아무것도 리턴하지 않고 (void),
// Config 타입일 경우 config.path, config.state를 리턴
3) 파라미터의 개수가 다른 경우
type Add2 = {
(a:number, b:number): number,
(a:number, b:number, c:number): number
}
// 하단 c는 기본형이 아닌 선택사항이므로 (optional한 형태)
// 다른 개수의(c) 파라미터를 가지게 되면, 나머지 파라미터의 타입을 다시 언급해 지정해주어야 한다.
// 물음표와 함께 추가적으로 type 지정
// 이 파라미터는 선택사항임을 알려줌.
const add2: Add2 = (a, b, c?:number) => {
if (c) return a + b + c
return a + b
}
add3 (1, 2)
add3 (1, 2, 3)
// 오류 없이 클린
https://velog.io/@sunn/Typescript-Call-Signatures-Overloading