- 타입스크립트는 지각적임.
- 함수가 반환할 수 있는 가능한 모든 값을 이해하면 함수가 반환하는 타입을 알 수 있음
// 타입: (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;
}
📍 명시적 반환 타입
- 변수와 마찬가지로 애너테이션을 사용해 함수의 반환 타입을 명시적으로 선언하지 않는 것이 좋음.
- 그러나, 특히 함수에서 반환 타입을 명시적으로 선언하는 방식이 매우 유용할 때가 종종 있음
- 가능한 반환값이 많은 함수가 항상 동일한 타입의 값을 반환하도록 강제함
- 타입스크립트는 재귀 함수의 반환 타입을 통해 타입을 유추하는 것을 거부함
- 수백 개 이상의 타입스크립트 파일이 있는 매우 큰 프로젝트에서 타입스크립트 타입 검사 속도를 높일 수 있음
- 매개변수 목록이 끝나는
)
다음에 배치. 함수 선언의 경우는 {
앞에 배치
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
}
}