Post

TypeScript 데이터 타입 (2) | 객체 타입 설계 방법

객체 타입 리터럴과 타입 별칭, 인덱스 시그니처를 통해 타입을 설계하는 여러 접근 방식을 비교해봅니다.

TypeScript 데이터 타입 (2) | 객체 타입 설계 방법

1. 객체 리터럴 타입 (Object Literal Type)

  • { key: value } 구조를 가지며, 각 속성의 타입을 명시할 수 있다.
  • 타입스크립트는 구조적 타입 시스템(Structural Type System) 을 사용해
    모양(형태)이 같으면 허용, 다르면 오류를 낸다.
  • 선언 시 모든 속성의 타입이 일치해야 하며, 누락되거나 다른 타입이 들어가면 오류 발생.
1
2
3
4
5
6
7
8
9
10
11
// ✔️ 올바른 예시 
let user: { name: string; age: number } = {
  name: "jerry",
  age: 3,
};

// ❌ 오류 (타입 불일치)
user = {
  name: "jerry",
  age: "30",
};

1-1. 선택적 속성 (Optional Property)

  • 있어도 되고 없어도 되는 속성은 ? 로 표시
1
let user: { name: string; age?: number } = { name: "jerry" };

1-2. 읽기 전용 속성 (Readonly Property)

  • 한 번 지정하면 수정이 불가능하다.
1
2
let config: { readonly version: string } = { version: "1.0.0" };
// config.version = "2.0"; ❌ 오류

2. 타입 별칭 (Type Alias)

  • 자주 쓰는 타입 구조에 이름을 붙여 재사용할 수 있다.
  • type 키워드를 사용하며, 객체 타입이 복잡하거나 반복될 때 유용하다.
  • 객체 타입이 복잡하거나 반복될 때 유용함
  • 함수 내부에서 같은 이름을 쓰면 안쪽이 우선 적용된다.
1
2
3
4
5
6
7
8
9
// ✔️ 타입 별칭 선언
type User = {
  name: string;
  age: number;
};

// ✔️ 타입 별칭 사용
let user1: User = { name: "jerry", age: 3 };
let user2: User = { name: "tom", age: 5 };

3. 인덱스 시그니처 (Index Signature)

  • 객체의 key정해져 있지 않고 동적일 때 타입을 지정하는 문법
  • [key: string]: valueType 형태로 정의하여 유연한 객체 구조를 표현할 수 있다.
  • 모든 keyvalue 타입이 동일해야 함에 주의.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// ✔️ 모든 key와 value는 문자열이어야 함
type CountryCodes = {
  [key: string]: string;
};

let countryCodes: CountryCodes = {
  Korea: "ko",
  Japan: "jp",
  UnitedStates: "us",
};

// ✔️ 값 타입 제한 예시
type UserAge = {
  [key: string]: number;
};

let userAge: UserAge = {
  jerry: 3,
  tom: "5", // ❌ 오류 (모든 속성의 값 타입이 동일해야 함)
};

4. 객체 타입 요약 정리

구분문법핵심시점주의
리터럴{ name: string }객체 구조 명시기본 정의타입 불일치 ❌
선택속성{ age?: number }생략 가능값 선택적존재 안 할 수도
별칭type User = {...}타입 이름화재사용중복명 주의
시그니처{ [k: string]: n }동적 key 정의유동 구조value 타입 통일


💡 학습정리

객체 리터럴 ➡ 객체의 틀을 정함
선택적 속성 ➡ 있어도 되고 없어도 됨
타입 별칭 ➡ 이름 붙여 재사용 가능
인덱스 시그니처key가 바뀌어도 OK (동적 구조)

This post is licensed under CC BY 4.0 by the author.