call signature는 다른 프로그래밍 언어처럼 delegate와 비슷한 개념을 가진다. type 키워드로 function과 lambda parameter에 type을 선언을하였고 return type도 선언하였다. 그리고 type 키워드는 변수뿐만 아니라 function에도 타입을 지정할 수 있다.
type Add = (a:number, b:number) => number;
const add :Add = (a, b) => a+b;
위 코드를 보면 type 키워드로 lambda형식의 type을 만들었다. 이렇게 보면 type은 모든 concrete type 뿐만 아니라 lambda type
을 지정할 수 있다.
<aside> 📌 Type declaration
type <type-name> = (<parameter> : type) ⇒ <return-type>
type callSign = (arr:string) => string
const callFunc : callSign = (arr:string) => string
</aside>
오버로딩은 여러개의 call signature를 가질때 발생한다.
type Config ={
path : string;
state : number;
};
type Push = {
(path:string):void
(config:Config):void
}
const push:Push = (config)=>{
if(typeof config == 'string'){
console.log(config)
}else
console.log(config.path)
}
or
const push:Push = (config)=>console.log(config)
overloading 정의
type <type-name> = { (<parameter> : type) : <return-type> (<parameter> : type) : <return-type>}
type으로 Config를 정의하고 Push Property는 두개의 call signature를 정의하였다.
또한 config parameter type을 새로 정의한 Config로 선언하였다.
overloading 사용
const <variable> : <overloading-type-name> = (<parameter> : type) ⇒ { // if else filtercode}
위 overloading을 사용하는 코드를 보면 두가지 방법
으로 사용할 수 있는데 보통 if문으로 parameter를 filtering하여 type에 따라 실행하는 코드를 다르게
할 수 있다. 그런데 return type이 서로 같은 상태
에서 parameter type만 다를경우 parameter는 type의 속성을 사용할 수 없고 type 키워드가 가지고 있는 요소들만 사용할 수 있다. (ex. toString(), valueOf() 같은거) 결국 사용할 가치가 거의 없다고 보면된다.
const push:Push = (config)=>{
if(typeof config == 'string'){
console.log(config)
}else
console.log(config.path)
}
or
const push:Push = (config)=>console.log(config) // type 키워드의 static요소인 toString(), valueOf()만 사용이 가능하다