TypeScript 타입 시스템 뜯어보기: 타입 호환성
김병묵 · 토스 · 토스 기술 블로그
소개
타입호환성은 무엇이며 왜 필요할까요? 타입호환이 지원되지 않는 경우가 존재한다는 것을 아셨나요? 평소 익숙했던 개념들에 대해 질문을 던져가며 TypeScript 타입 시스템에 관해 심도있게 알아보고자 합니다.
AI 핵심 요약
TypeScript의 구조적 서브타이핑은 필요한 프로퍼티를 갖춘 객체를 별도의 상속 선언 없이 사용할 수 있게 하지만, 추가 프로퍼티나 오타가 놓칠 수 있다는 부작용도 있다. 컴파일러의 `checker.ts`와 관련 GitHub PR을 살펴보면, 객체 리터럴을 함수에 직접 전달할 때는 fresh object로 간주해 excess property 검사를 적용하고, 변수에 담긴 객체에는 일반적인 구조적 호환성을 허용한다. 이 예외는 함수가 사용하지 않는 데이터에 대한 오해와 프로퍼티 오타를 줄이기 위한 절충안이다. 필요에 따라 index signature로 추가 프로퍼티를 허용하거나 branded type으로 호환을 제한할 수 있다.
- TypeScript의 구조적 서브타이핑은 상속 선언보다 객체가 가진 프로퍼티를 기준으로 호환성을 판단한다.
- 객체 리터럴을 함수에 바로 전달하면 excess property 검사가 적용되어, 대상 타입에 없는 프로퍼티나 오타를 잡아낸다.
- 객체 리터럴을 변수에 먼저 담으면 freshness가 사라져 추가 프로퍼티가 있어도 구조적으로 호환될 수 있다.
- 추가 프로퍼티를 허용하려면 index signature를 사용할 수 있고, 타입 간 구분을 강제하려면 branded type을 고려할 수 있다.
비슷한 학습 자료
내 타입스크립트 코드가 이렇게 느릴 리 없어! | 2024 당근 테크 밋업
당근테크 · YouTube
infer, never만 보면 두려워지는 당신을 위한 고급 TypeScript
엔지니어링데이 2025 · YouTube
토스의 접근성 문서 A11y Fundamentals 을 소개합니다 (오픈 기념 이벤트 ~9/10)
강민우 · 토스 기술 블로그
React Native에서 타입 안전한 파일 기반 라우팅 구현하기
강선규 · 토스 기술 블로그
ts-pattern은 더 멋진 if문이 아니다
허민 · 토스 기술 블로그
Template Literal Types로 타입 안전하게 코딩하기
박서진 · 토스 기술 블로그