TS 2.3 · 2부. 함수와 객체

객체 타입

객체가 어떤 이름과 값을 담는지 적습니다.

예상 학습 시간 15분 실행 단추가 있는 예제는 고쳐서 실행해 볼 수 있습니다 난이도 입문
개념 설명

어떤 이름과 값을 담는지 적습니다

객체의 타입은 객체를 적는 것과 비슷하게 생겼습니다. 값 자리에 값 대신 타입을 적습니다.

// 값
{ name: "홍길동", age: 27 }

// 타입
{ name: string; age: number }

속을 가르는 것이 쉼표가 아니라 세미콜론입니다. 쉼표도 되지만 세미콜론이 흔한 표기입니다.

최소 예제 · 편집 가능

객체에 타입 적기

main.ts
const user: { name: string; age: number } = {
	name: "홍길동",
	age: 27
};

console.log(`${user.name} (${user.age})`);
출력
홍길동 (27)

이렇게 길게 적을 일은 실제로는 드뭅니다. 값을 바로 넣으면 추론되고(1.2), 여러 곳에서 사용할 형태는 이름을 붙여 둡니다(2.4). 여기서는 모양을 보려고 적었습니다.

상세 사용법

빠뜨려도, 더 넣어도 막습니다

main.ts
const user: { name: string; age: number } = {
	name: "홍길동"
};
출력
1:7 TS2741 'age' 속성이 '{ name: string; }' 형식에 없지만 '{ name: string; age: number; }' 형식에서 필수입니다.
main.ts
const user: { name: string } = {
	name: "홍길동",
	age: 27
};
출력
3:2 TS2353 개체 리터럴은 알려진 속성만 지정할 수 있으며 '{ name: string; }' 형식에 'age'이(가) 없습니다.

더 넣은 것까지 막는 것은 오타를 잡기 위해서입니다. nicknamenickName 으로 적으면 없는 속성을 넣은 셈인데, 막지 않으면 조용히 지나갑니다.

없어도 되는 속성은 ? 를 붙여 둡니다(1.6) — { name: string; nickname?: string }.

상세 사용법

안에 객체가 또 있을 때

main.ts
const order: {
	id: number;
	buyer: { name: string; phone: string };
	items: string[];
} = {
	id: 1,
	buyer: { name: "홍길동", phone: "010-0000-0000" },
	items: ["연필", "공책"]
};

console.log(order.buyer.name);
console.log(order.items.length);
출력
홍길동 2

이쯤 되면 이름을 붙여야 합니다. 다음 단원에서 이 타입을 조각으로 나누어 이름을 붙입니다.

상세 사용법

바꾸지 못하게 하기 — readonly

main.ts
const user: { readonly id: number; name: string } = { id: 1, name: "홍길동" };

user.name = "김철수";
console.log(user.name);

user.id = 2;
출력
6:6 TS2540 읽기 전용 속성이므로 'id'에 할당할 수 없습니다.

const변수에 다른 것을 넣는 것을 막고, readonly객체 안의 값을 바꾸는 것을 막습니다. 아이디처럼 만든 뒤 바뀌지 않아야 하는 것에 붙입니다.

흔한 실수

처음에 자주 걸리는 것

변수를 거치면 더 넣은 것이 지나갑니다

더 넣은 것을 막는 검사는 중괄호를 그 자리에 바로 적을 때만 합니다. 변수에 담아 두었다가 넘기면 지나갑니다. 놀랄 만한 규칙이지만, 그렇게 정해져 있습니다.

타입 자리와 값 자리를 헷갈리는 것

{ name: string } 에서 string 은 타입이고, { name: "홍길동" } 에서 "홍길동" 은 값입니다. 콜론 오른쪽에 무엇이 오는지가 자리마다 다릅니다.

readonly 는 안쪽까지 막지 않습니다

readonly items: string[] 는 배열을 바꿔 넣는 것만 막습니다. items.push(…) 는 됩니다.

실습 문제

직접 해보기

1. 책 정보 난이도 중

제목·쪽수·지은이(안에 이름이 있는 객체)를 담는 객체를 타입과 함께 만들고 한 줄로 출력하세요.

const book: { title: string; pages: number; author: { name: string } } = {
	title: "타입스크립트 입문",
	pages: 320,
	author: { name: "홍길동" }
};

console.log(`${book.title} (${book.pages}쪽) ${book.author.name}`);
2. 바꾸지 못하게 하기 난이도 하

위 책에서 제목만 바꾸지 못하게 하고, 바꾸려 하면 어떤 오류가 나는지 확인하세요.

title 앞에 readonly 를 붙입니다. book.title = "다른 제목" 을 적으면 "읽기 전용 속성이므로 할당할 수 없습니다" 가 나옵니다.
요약

이 단원의 정리

  • 객체 타입은 값과 비슷하게 생겼고, 값 자리에 타입을 적습니다.
  • 속은 세미콜론으로 가릅니다.
  • 빠뜨려도 막고, 적어 두지 않은 것을 더 넣어도 막습니다.
  • 없어도 되는 속성은 ? 를 붙입니다.
  • readonly 는 그 속성을 바꾸지 못하게 합니다.