본문으로 이동
TypeScript 타입 시스템 뜯어보기: 타입 호환성
문서

TypeScript 타입 시스템 뜯어보기: 타입 호환성

김병묵 · 토스 · 토스 기술 블로그

원본 보기

소개

타입호환성은 무엇이며 왜 필요할까요? 타입호환이 지원되지 않는 경우가 존재한다는 것을 아셨나요? 평소 익숙했던 개념들에 대해 질문을 던져가며 TypeScript 타입 시스템에 관해 심도있게 알아보고자 합니다.

AI 핵심 요약

TypeScript의 구조적 서브타이핑은 필요한 프로퍼티를 갖춘 객체를 별도의 상속 선언 없이 사용할 수 있게 하지만, 추가 프로퍼티나 오타가 놓칠 수 있다는 부작용도 있다. 컴파일러의 `checker.ts`와 관련 GitHub PR을 살펴보면, 객체 리터럴을 함수에 직접 전달할 때는 fresh object로 간주해 excess property 검사를 적용하고, 변수에 담긴 객체에는 일반적인 구조적 호환성을 허용한다. 이 예외는 함수가 사용하지 않는 데이터에 대한 오해와 프로퍼티 오타를 줄이기 위한 절충안이다. 필요에 따라 index signature로 추가 프로퍼티를 허용하거나 branded type으로 호환을 제한할 수 있다.

  • TypeScript의 구조적 서브타이핑은 상속 선언보다 객체가 가진 프로퍼티를 기준으로 호환성을 판단한다.
  • 객체 리터럴을 함수에 바로 전달하면 excess property 검사가 적용되어, 대상 타입에 없는 프로퍼티나 오타를 잡아낸다.
  • 객체 리터럴을 변수에 먼저 담으면 freshness가 사라져 추가 프로퍼티가 있어도 구조적으로 호환될 수 있다.
  • 추가 프로퍼티를 허용하려면 index signature를 사용할 수 있고, 타입 간 구분을 강제하려면 branded type을 고려할 수 있다.