1. Call Signatures

: 함수의 타입을 먼저 설정하고 함수 선언하기

type Add = (a: number, b: number) => number;

const add: Add = (a, b) => a + b;
type Add = {
  (a: number, b: number) : number
}

const add: Add = (a, b) => a + b;

2. Overloading

: 함수가 서로 다른 여러 개의 call signatures를 가지고 있을 때 발생

(ex.1) 파라미터의 개수가 다를 경우 > 결과적으로 옵셔널한 파라미터

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

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

(ex.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);
  }
};

3. polymorphism & generic type

: type에 placeholder를 사용하는 것과 같은 개념