[Typescript] 기초 다지기 2 : 타입 추론

dee·2022년 10월 3일
0

typescript

목록 보기
2/5
post-thumbnail

🤔 타입을 명시하지 않으면 어떻게 될까?

특정 상황에 따라 오류를 표시하지 않는다.
변수를 초기화할 때 타입을 지정하지 않아도 오류를 내뱉지 않는다. 에디터에서 마우스를 올려서 확인하면 이미 타입이 자동으로 지정되어 있는 것을 볼 수 있다.
이 원리는 무엇인지에 대해 알아보자.


기초 2. 타입 추론 (Inference)

  • 타입스크립트는 타입 선언이 명시적으로 되어있지 않으면 타입을 추론한다. 추론하는 경우는 3가지가 있으며 아래와 같다.

    • 초기화된 변수
    • 기본값이 설정된 매개 변수
    • 반환 값이 있는 함수
  • 아래 예제를 통해 타입 추론을 정확하게 이해하자.
    1. 변수 a
      • 초기화하면서 string인 'apple'를 할당하여 string 타입으로 추론되었다.
    2. 변수 b
      • 초기화하면서 number인 3을 할당하여 number 타입으로 추론되었다.
    3. 함수 addAnimal
      • 매개 변수 기본값이 설정되어있어 name은 string으로, age는 number로 추론되었다.
      • 반환 값이 string + age 이므로 '+'가 문자열 연결 연산자로 적용되어 string으로 추론되었다.
let a = 'apple'; // 1. let a: string;
let b = 3; // 2. let b: number;


function addAnimal(name = 'kitty', age = 2) {
	return name + age
} // 3. function addAnimal(name?: string, age?: number): string;

🧐 이와 같이 코드를 바탕으로 값의 타입을 추론하고 있다. 숫자나 문자같이 하나만 할당되는 경우에는 타입이 하나이지만 배열과 같이 여러 개의 항목이 있는 경우 가장 근접한 타입(Best Common Type)을 추론하게 된다.

  • Best Common Type
    주어진 요소들의 유형을 고려하여 모든 타입을 포괄할 수 있는 유형을 선택하는 방식이다. 그러나 타입 추론 값이 직접 명시하는 것과 미묘한 차이가 있다. 그 차이를 예제를 통해서 정리하자.
class Fruits {}
class Apple extends Fruits {
	color: 'red';
}
class Banana extends Fruits {
	flavor: 'sweet';
}
class Peach extends Fruits {
	color: 'red';
}

let basket = [new Apple(), new Banana(), new Peach()];

Fruits를 상속받는 Apple, Banana, Peach가 있으며 각각의 클래스가 basket 배열의 항목으로 할당되어 있다. 타입스크립트는 이를 단순히 let basket: (Apple | Banana | Peach)[]로 추론을 한다. 이 결과값이 명시적인 것과 어떤 점이 다른 지 의아할 것이다.

그렇다면 타입을 명시적으로 한 경우와 비교해보자

let basket1 = [new Apple(), new Banana(), new Peach()]; 
// let basket1: (Apple | Banana | Peach)[];

let basket2: Fruits[] = [new Apple(), new Banana(), new Peach()]; 
// let basket2: Fruits[];

이렇게 두 개의 미묘한 차이를 볼 수 있다. 수퍼클래스를 명시하지 않으면 엄격하게 Fruits의 유형을 가진 배열의 항목을 찾을 수 없기 때문에 union 형식의 타입을 추론하게 된다.

🧐 위의 예시를 공부하면서 예상 가능한 타입이 반환이 되려면 명시적으로 써야할 필요가 있다는 것을 알았다. 또한 예제처럼 클래스의 경우, 타입을 통해 부모와 자식 클래스가 파악할 수 있다는 것을 깨달았다. 이런 식으로 타입과 값에 대한 관계를 생각하고 명시적으로 작성하면 코드를 더 논리적으로 작성할 수 있지 않을까 기대해본다.


🍑 오늘의 공부 일기

타입 추론에 대해 짧게 공부하고 넘어가려다가 타입을 추론하는 방식에 호기심이 가서 조금 더 공부하게 되었다. 공부를 하면서 타입스크립트의 이점을 다시 한번 발견하는 계기가 되었고 타입에 대해서도 단순히 기입만 되는 것이 아니라는 것을 느끼게 되었다.
타입 표기에 대해서 더 공부하면서 나만의 생각을 정리가 필요할 듯 싶다.


참고 자료
https://joshua1988.github.io/ts/guide/type-inference.html
https://yamoo9.gitbook.io/typescript/types/primitives
https://www.typescriptlang.org/docs/handbook/type-inference.html

profile
웹 프론트엔드 개발자

0개의 댓글