Search
📖

아이템 23. 한꺼번에 객체 생성

객체는 필요한 속성을 모두 포함해 ‘한번에' 생성해야 타입추론에 유리
객체를 나눠 만들때는 타입단언문(as), 작은 객체 조합 시에는 객체 전개 연산자(…) ⇒ 타입 추론 가능

1. 한꺼번에 객체 생성하기

객체는 한 번에 생성해야 타입추론에 유리
// 생성시 없는 속성은 추가 시 에러 발생 const pt = {} pt.x = 3 // error (...Property 'x' does not exist...) pt.y = 4 // error (...Property 'y' does not exist...) // 필요한 속성을 타입에만 미리 정의할 시 에러 발생 interface Point { x: number y: number } const pt2: Point = {} // ~~ Type '{}' is missing the following properties from type 'Point': x pt.x = 3
TypeScript
복사
반드시 객체를 나눠 만들어야 할 시 ‘타입 단언문’ (as) 사용
interface Point { x: number y: number } const pt = {} as Point pt.x = 3 // OK pt.y = 4 // OK
TypeScript
복사
작은 객체를 조합해 더 큰 객체를 만들 때는 ‘객체 전개 연산자' 사용
작은 객체를 큰 객체에 단순 추가 시 값만 반영되고 타입은 반영되지 않음
const pt = { x: 3, y: 4 } const id = { name: 'Pythagoras' } const namedPoint = {} Object.assign(namedPoint, pt, id) // namePoint에는 원하는 속성이 잘 추가 되었으나 console.info(namePoint) // { x: 3, y: 4, name: 'Pythagoras' } // namePoint type은 여전히 빈 객체로 나옴 namedPoint.name // error: ...Property 'name' does not exist...
TypeScript
복사
객체 전개 연산자 사용 추가 시 값과 타입이 모두 잘 반영 됨
const namedPoint = { ...pt, ...id } console.info(namePoint) // { x: 3, y: 4, name: 'Pythagoras' } namedPoint.name // OK
TypeScript
복사
객체 전개 연산자 사용 시 필드 단위로도 객체 생성 가능
// 업데이트마다 새 변수 사용하여 각각에 맞는 타입을 얻도록 해야함 interface Point { x: number y: number } const pt0 = {} const pt1 = { ...pt0, x: 3 } const pt: Point = { ...pt1, y: 4 }
TypeScript
복사
객체 전개 연산자 사용해서 조건부 속성 추가도 가능
// null 또는 빈 객체({})사용하여 조건부로 속성 추가도 가능 declare let hasMiddle: boolean const firstLast = { first: 'Harry', last: 'Truman' } const president = { ...firstLast, ...(hasMiddle ? { middle: 'S' } : {}) } // 조건부로 속성 추가는 한 번에 두 개 이상의 속성도 추가 가능 const pharaoh = { ...firstLast, ...(hasDate ? { start: -2589, end: -2566 } : {}), }
TypeScript
복사