"매 object literal 을 직접 assign / pass 할 때만 발동하는 TS 의 추가 strictness rule". 매 structural typing 의 원칙적으론 OK 인 extra property 를 매 fresh object literal 에 한해 error 로 잡아 typo 방지. 매 변수 경유 시 자동 비활성화.
매 핵심
매 작동 방식
TS 의 structural / duck typing 은 매 extra property OK.
그러나 매 object literal 을 fresh 하게 assign 시 TS 는 추가로 surplus key 를 error 로 보고.
매 변수에 한 번 alias 하면 fresh 신호가 사라져 EPC 우회.
매 발동 조건
매 object literal 의 직접 assignment / argument / return.
매 contextual type 이 존재.
매 변수 경유, type assertion (as), spread 시 비활성화.
매 응용
Component prop typo 방지 (React).
API request body 의 surplus field 차단.
Config object 의 misnamed key 발견.
💻 패턴
매 EPC 발동 (error)
interfaceUser{name: string;age: number}constu: User={name:"Lee",age: 30,emial:"x"};// ^^^^^ 매 EPC: 'emial' does not exist on User
매 변수 경유 우회 (error 사라짐)
constraw={name:"Lee",age: 30,emial:"x"};constu: User=raw;// ✅ OK — fresh 아니라 EPC 비활성
// 매 structural compatibility 만 본다 (User 의 모든 prop 충족 → OK)
interfaceLoose{name: string;[key: string]:unknown;}constl: Loose={name:"A",whatever: 123,deep:{x: 1}};// ✅ OK
매 union type 의 EPC quirk
typeA={kind:"a";a: number};typeB={kind:"b";b: number};constx: A|B={kind:"a",a: 1,b: 2};// ❌ EPC: 'b' is not in A; not in B 의 fresh form
// 매 변수 경유 시 통과 — 의도치 않은 leakage 가능
매 의도적 우회 (type assertion — 위험)
constu: User={name:"A",age: 1,emial:"x"}asUser;// ⚠ 매 작동하지만 매 typo 의 silent — 매 강력히 X
매 React component prop typo 방지
typeButtonProps={label: string;onClick:()=>void};constButton=(p: ButtonProps)=><buttononClick={p.onClick}>{p.label}</button>;<Buttonlabl="Hi"onClick={()=>{}}/>;// ❌ EPC: 'labl' typo 발견
매 satisfies operator (TS 4.9+) — 매 EPC 유지 + inference
constconfig={port: 8080,host:"localhost",// typoKey: 1 // ❌ EPC error if uncomment
}satisfies{port: number;host: string};// 매 config.port: number 의 narrow type 유지 + EPC 활성
매 결정 기준
상황
Approach
매 strict typo 검출
매 object literal 직접 assign + EPC 활용
매 동적 key 다수
index signature 추가
매 narrow + EPC 동시
satisfies operator
매 변수 경유 필요
type annotation 변수 + literal 사용
매 EPC 의도적 회피
매 보통 X — type 의 재설계
기본값: 매 object literal 의 직접 assign + satisfies 또는 explicit type — 매 변수 경유 의 무의식적 우회 X.
🔗 Graph
부모: TypeScript · 구조적 타이핑(Structural Typing)
변형: satisfies operator
응용: API Contract
Adjacent: Type Narrowing · Discriminated Union
🤖 LLM 활용
언제: TS error 디버깅 ("excess property"), refactor 시 EPC 의도 검증.
언제 X: 매 runtime validation — 매 EPC 는 컴파일타임만.
❌ 안티패턴
as Type 으로 EPC 회피: 매 typo 의 silent.
변수 경유 의 우회: 매 의도면 OK, 매 실수면 위험.
EPC 비활성화 의 흔한 오해: 매 spread { ...x, extra: 1 } 의 fresh — EPC 발동.
runtime 신뢰: EPC 는 매 compile-time only — 매 런타임 검증 X.