Call signatures

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>

Overloading

오버로딩은 여러개의 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()만 사용이 가능하다