타입 추론이란 타입스크립트가 코드를 해석하여 적절한 타입을 정의하는 동작을 의미합니다.
위의 코드를 살펴보면,
x
변수에 숫자 3이 할당되었기 때문에 x
변수의 타입은 number
로 추론됩니다.타입 추론이 발생할 때
const a; // -> any
a
변수를 선언하였습니다.a
변수에 값을 할당하지 않고 선언만 했기 때문에 any
타입으로 추론됩니다.const a; // -> any
a = 10; // -> number
const b = 'dove'; // -> string
a
변수를 선언하고 그 다음 줄에 값을 할당하였습니다.a
변수는 any
타입으로 추론되고, 두 번째 줄에서 a
변수는 숫자가 할당되었기 때문에 number
타입으로 추론됩니다.b
변수는 선언과 할당을 동시에 했기 때문에 초깃값에 따라서 적절한 타입인 문자열 타입으로 추론됩니다.이처럼 변수 타입은 선언하는 시점에 할당된 값을 기반으로 추론됩니다.
function sum(a: number, b: number): number {
return a + b;
}
const result = sum(1, 2); // -> number
sum()
은 파라미터로 숫자 타입의 a와 b를 받고 반환값으로 두 수를 더한 값을 반환하는 함수입니다.sum
함수의 반환값이 숫자 타입이기 때문에 result
변수의 타입이 number
타입으로 추론됩니다.function sum(a: number, b: number) {
return a + b;
}
const result = sum(1, 2); // -> number
sum
함수 또한 파라미터로 숫자 타입을 받지만 반환값은 타입을 명시하지 않았습니다.result
변수는 타입이 number
로 추론됩니다. 왜냐하면 sum
함수는 파라미터로 받은 값을 더해서 반환하는데, 파라미터가 모두 숫자이므로 반환값 또한 숫자가 되기 때문입니다.function getA(a) { // -> any
return a; // -> any
}
getA
함수는 파라미터를 받아 그대로 반환합니다. any
타입이 됩니다.function getA(a = 10) { // -> number
return a; // -> number
}
getA
함수는 파라미터의 기본값으로 숫자 10을 설정하였습니다.number
타입으로 추론되고, 반환값 또한 파라미터 값을 그대로 반환하기 때문에 number
타입으로 추론됩니다.interface Animation<T> {
year: number;
title: T;
}
interface DetailedAnimation<T> extends Animation<K> {
genre: string;
description: string;
}
let haikyuu: DetailedAnimation<string> = {
year: 2012,
title: '하이큐',
genere: '스포츠',
description: '배구'
}
Animation
인터페이스는 year
과 title
속성이 있고, DetailedAnimation
인터페이스는 Animation
인터페이스를 상속받았고 genre
와 description
속성이 있습니다.haikyuu
변수는 제네릭으로 string
타입을 받은 DetailedAnimation
인터페이스를 타입으로 받았습니다.title
속성은 string
타입으로 추론됩니다.DetailedAnimation
인터페이스에 넘긴 제네릭 타입이 Animation
인터페이스의 제네릭 타입으로 전달됩니다.타입스크립트는 타입을 명시하여 에러를 줄이기 위해 도입되었습니다. 하지만 일일이 타입을 명시하느라 코드 양이 증가하고, 코드 작성 시간이 늘어나는 등의 문제점이 있습니다. 하지만 타입 추론을 잘 알고 있으면 이러한 문제점들이 어느 정도 해소될 수 있습니다.
타입스크립트는 무조건 모든 타입을 명시해야할 것 같지만 실제로는 타입 추론을 통해 어느정도 타입이 추론되기 때문에 굳이 명시하지 않아도 됩니다.
다시 말해, 타입이 어디에서, 어떻게 추론되는지 잘 알게 되면 코드를 더 간결하게 작성할 수 있습니다.
참고
📖 쉽게 시작하는 타입스크립트
🔗 https://www.typescriptlang.org/ko/docs/handbook/type-inference.html