•
객체는 필요한 속성을 모두 포함해 ‘한번에' 생성해야 타입추론에 유리
•
객체를 나눠 만들때는 타입단언문(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
복사