OBJECT SHAPES

객체 타입과 인터페이스 검사

TypeScript에서 객체 타입은 속성 이름과 타입의 구조로 검사된다. 하지만 객체 리터럴을 바로 넣을 때의 초과 속성 점검, optional과 readonly, index signature, interface declaration merging까지 알아야 실제 오류를 읽을 수 있다.

01

필수 속성 확인

타입에 선언된 필수 속성이 객체에 모두 있는지 검사한다.

구조적 타입이라 이름보다 모양이 중요하다
02

선택 속성 처리

optional 속성은 없을 수 있으므로 읽을 때 undefined 가능성을 다룬다.

exactOptionalPropertyTypes 설정에 따라 의미가 더 엄격해진다
03

초과 속성 검사

객체 리터럴을 바로 할당하면 오타처럼 보이는 추가 속성을 잡는다.

변수에 담은 뒤 할당할 때는 다르게 보일 수 있다
04

읽기 전용 제한

readonly 속성은 재할당을 막지만 중첩 객체의 깊은 불변까지 자동 보장하지 않는다.

shallow readonly를 이해한다
05

확장 방식 선택

interface는 merging과 extends, type alias는 union과 mapped type에 강점이 있다.

둘은 겹치지만 완전히 같지 않다
optional
없을 수 있는 속성 읽을 때 undefined 분기를 요구하고 기본값 처리와 연결된다.
값이 undefined인 것과 속성 부재를 구분할 수 있다
readonly
재할당 방지 속성 쓰기를 막아 API 입력 객체를 보호한다.
깊은 불변은 별도 타입이 필요하다
index signature
동적 key 정해지지 않은 key 집합을 허용하지만 모든 값 타입을 넓힌다.
정확한 key union이 가능하면 더 안전하다
초과 속성 점검
리터럴 오타 탐지 직접 전달한 객체 리터럴의 불필요한 속성을 잡는다.
중간 변수에 담으면 동작이 달라질 수 있다

객체 타입 확인

오타 탐지 객체 리터럴에 잘못된 속성을 넣어 초과 속성 검사가 잡는지 확인한다.
optional 읽기 선택 속성을 바로 사용하지 않고 좁히기나 기본값을 거치는지 본다.
확장 정책 interface merging이 의도인지, type alias로 닫힌 계약이 나은지 판단한다.