// 타입: (songs: string[]) => number
function singSongs(songs: string[]) {
  for (const song of songs) {
    console.log(`${song}`);
  }

  return songs.length;
}

// 타입: (songs: string[], index: number) => string | undefined
function getSongAt(songs: string[], index: number) {
  return index < songs.length ? songs[index] : undefined;
}

📍 명시적 반환 타입

  1. 가능한 반환값이 많은 함수가 항상 동일한 타입의 값을 반환하도록 강제함
  2. 타입스크립트는 재귀 함수의 반환 타입을 통해 타입을 유추하는 것을 거부함
  3. 수백 개 이상의 타입스크립트 파일이 있는 매우 큰 프로젝트에서 타입스크립트 타입 검사 속도를 높일 수 있음
function singSongsRecursive(songs: string[], count = 0): number {
  return songs.length ? singSongsRecursive(songs.slice(1), count + 1) : count;
}

const singSongsRecursive = (songs: string[], count = 0): number =>
  songs.length ? singSongsRecursive(songs.slice(1), count + 1) : count;

function getSongRecordingDate(song: string): Date | undefined {
  switch (song) {
    case "Strange Fruit":
      return new Date("April 20, 1939"); // ✅ Ok
    case "Greensleeves":
      return "unknown"; // ❌ Error
    default:
      return undefined; // ✅ Ok
  }
}