백엔드/Node.js

[TS] 타입스크립트 추론 종류 - 타입 추론(Type Inference) / 리터럴 추론(Literal Inference)

SparkIT 2025. 4. 14. 15:22

1. 타입 추론(Type Inference)

타입스크립트에서는 타입을 명시적으로 지정하지 않더라도 자동으로 타입을 유추합니다. 이를 타입 추론(Type Inference)라고 부릅니다. 자바스크립트와 타입스크립트의 차이를 통해 설명하겠습니다.

  • 자바스크립트
// javascript 예시

let js = "hello";

js = 1234;
  • 타입스크립트
// typescript 예시

let js = "hello";

js = 1234;
// ❗️에러 발생 :  Type 'number' is not assignable to type 'string'.
// let js: string

 

이런 타입 추론으로 인해 타입스크립트에서 일일이 타입을 안 써도 되어 편리한 개발이 가능해집니다. 또한 타입 추론을 통해 타입 안정성이 확보됩니다.

 

 

2. 리터럴 추론(Literal Inference)

타입스크립트에서 변수를 선언할 때 let, const에 따라 추론되는 과정이 다릅니다.

  • let
let ts = "hello";
// ts는 string 타입으로 추론됨
  • const
const ts = "hello";
// ts는 "hello" 리터럴 타입으로 추론됨

 

즉, 다음과 같이 리터럴 타입 추론을 통해 더 강한 제약을 걸 수 있습니다.

type Direction = "up" | "down" | "left" | "right";

const dir = "up"; // let이면 string 타입, const면 "up" 리터럴 타입
function move(d: Direction) {}

move(dir); // let이면 에러, const면 통과!

 

하지만 객체의 경우 const로 선언만 한다고 문제가 해결되지는 않습니다. 아래 예시를 확인해봅시다.

const person = {
  name: "suji",
  age: 24,
  gender: "female"
}

function grow(name: string, age: number, gender: "male" | "female") {
  return {name: name, age: age+1, gender: gender };
}

grow(person.name, person.age, person.gender);
// ❗️에러 발생: Argument of type 'string' is not assignable to parameter of type '"female" | "male"'.(2345)
// (property) gender: string

person이라는 변수를 선언할 때 const 키워드를 사용했기는 했지만, const 변수의 속성에는 정확한 타입 추론이 사용되지 않습니다. 그러므로 person의 속성 name에는 string 타입이, age에는 number 타입이, gender에는 string 타입이 추론됩니다. 이런 이유로 grow 함수의 파라미터인 gender는 string이 아닌 "male" | "female" 유니온 타입이어 grow(person.name, person.age, person.gender) 이 부분에서 타입 에러가 발생하는 것입니다. 이를 해결하기 위해서는 아래와 같이 as const 명령어를 사용합니다.

const person = {
  name: "suji",
  age: 24,
  gender: "female"
} as const;

function grow(name: string, age: number, gender: "male" | "female") {
  return {name: name, age: age+1, gender: gender };
}

grow(person.name, person.age, person.gender);