`프론트엔드 개발자` 개형이의 벽돌집

타입스크립트 (3) - 타입의 추론. 타입은 어떻게 추론될까? 본문

타입스크립트

타입스크립트 (3) - 타입의 추론. 타입은 어떻게 추론될까?

개형이 2022. 5. 13. 10:45

타입스크립트는 명시적으로 타입을 지정해줄 수도 있지만 지정을 안해줄 경우 자동으로 타입을 추론한다.

어떻게 추론될까?

 


 

let 과 const의 타입 추론


변수의 초깃값으로 추론이 된다.

let a = 'Mark' // string
const b = 'Mark' // 'Mark' => literal type
let c = 38 // number
const d = 38 // 38 => literal type
let g = ['Mark', 'Pen'] // string[]
const h = ['Mark', 'Pen'] // string[]
const i = ['Mark', 'Pen'] as const // readonly ['Mark', 'Pen']

 

 

Best Common Type


타입스크립트는 타입 추론을 할 때 최선의 방식으로 추론한다.

let j = [0, 1, null] // (number | null) []
const j = [0, 1, null] // (number | null) []

 

-> number와 null을 포함시켜 배열을 선언하면 자동으로 (number | null) 타입으로 추론되는 것을 확인할 수 있다.

 

 

 

Contextual Typing


타입스크립트는 코드의 위치에 따라 다른 추론을 할 수 있다.

const click = (e) => {
  e; // any
}

document.addEventListener('click', (e) => {
  e; //MouseEvent
})

 

 

 

리터럴 추론


 

객체를 사용하여 변수를 초기화할 경우에 객체 프로퍼티는 이후에 값이 변화할 수 있다고 가정한다.

객체 리터럴 추론의 예시는 아래와 같다.

// (handleRequest는 url: string, method: "GET" | "POST")로 선언되었음

const req = { url: "https://example.com", method: "GET"};
handleRequest(req.url, req.method);

위 코드의 경우, string 타입은 "GET" | "POST"의 타입으로 할당될 수 없다고 나온다. 
method는 값이 변할 수 있는 string 타입으로 되었다고 판단되었기 때문이다.

 

그렇다면 객체의 리터럴 추론을 어떻게 보다 명확하게 할 수 있을까?

 

1) Type Assertion 사용 (타입 단언)

const req = { url: "https://example.com", method: "GET" as "GET" };
// 컴파일러에게 method의 타입이 "GET" 타입이라고 알려주는 것과 같습니다.

 

2) 객체 전체를 리터럴 타입으로 변환

const req = { url: "https://example.com", method: "GET" as "GET" };
// 컴파일러에게 method의 타입이 "GET" 타입이라고 알려주는 것과 같습니다.

 


 

타입의 추론을 간략하게 정리해두었다.

다음 포스팅에는 타입 가드를 어떻게 사용하는지 기록해 두고자 한다.

Comments