Skip to main content

객체 타입

객체 타입

info

대부분의 타입스크립트는 객체 타입을 지정해줄 때 인터페이스를 사용하는 것을 선호한다.

type Poet = {
born: number;
name: string;
}

let poetLater: Poet {
born: 1935,
name: "Cho Byeong Min"
}

구조적 타이핑

  • 타입스크립트의 타입 시스템은 구조적으로 타입화되어 있다.
  • 즉, 타입을 충족하는 모든 값을 해당 타입의 값으로 사용할 수 있다.
type WithFirstName = {
firstName: string;
};

type WithLastName = {
lastName: string;
};

const hasBoth = {
firstName: 'Cho',
lastName: 'Byeong Min',
};

let withFirstName: WithFirstName = hasBoth;
let withLastName: WithLastName = hasBoth;
  • hasBoth는 각각 string 타입의 firstName과 lastName을 포함한다.

사용 검사

  • 할당하는 값에는 객체 타입의 필수 속성이 있어야 한다.
  • 객체 타입에 필요한 모든 속성이 없다면 타입 오류를 발생시킨다.
type FirstAndLastName = {
first: string;
last: string;
};

const hasBoth: FirstAndLastName = {
first: 'Cho',
last: 'Byeong Min',
};

// 에러 발생
const hasOnlyOne: FirstAndLastName = {
first: 'Cho',
};

const hasFullInfo: FirstAndLastName = {
first: 'Cho',
last: 'Byeong Min',
age: 29,
};
  • hasOnlyOne은 last 속성이 없어 타입 오류가 발생한다.
  • hasFullInfo는 객체 타입에서 정의된 것 보다 많은 속성을 가지고 있어 타입 오류를 일으킨다.

선택적 속성

타입의 속성 앞에 ?를 추가해주면 타입 속성을 생략할 수 있다.

type Book = {
author?: string;
pages: number;
}

const ok: Book {
author: "Byeong Min",
pages: 80
}

const missingOk: Book = {
pages: 100
}
  • missingOk에서 author를 생략하여도 타입 오류가 발생하지 않는다.

명시된 객체 타입 union

type PoemWithPages = {
name: string;
pages: number;
}

type PoemWithRhymes = {
name: string;
rhymes: boolean;
}

type Poem = PoemWithPages | PoemWithRhymes;

const poem = Poem {}

poem.name;
poem.pages; // 에러 발생
poem.rhymes; // 에러 발생
  • name 속성은 항상 존재하기 때문에 접근이 가능하다.
  • pages와 rhymes는 항상 존재한다는 보장이 없어 타입 오류를 일으킨다.

교차 타입

type Artwork = {
genre: string;
name: string;
};

type Writing = {
pages: number;
name: string;
};

type WrittenArt = Artwork & Writing;

// 다음과 같음
// {
// genre: string;
// name: string;
// pages: number;
// }
  • 교차 타입은 다른 객체 타입이나 유니온 타입을 결합할 수 있다.