[한 입 크기로 잘라먹는 TypeScript] CH2. 타입스크립트 기본 2(3.객체, 4.타입 별칭과 인덱스 시그니쳐, 5.열거형 타입)

2024. 4. 10. 11:54·웹 프로그래밍/JavaScript | TypeScript

chapter 2. 타입스크립트 기본

3. 객체

✅ 객체 타입을 정의하는 방법

1️⃣ object로 정의하기

let user: object = {
  id: 1,
  name: "kim",
};

user.id; //오류 발생

 

객체 생성과 타입 정의를 잘해주었는데도 `user.id`를 이용해 객체의 프로퍼티에 접근하려 하면 오류가 발생한다.

👉 원인: 타입스크립트의 object 타입은 객체의 프로퍼티에 대한 어떤 정보도 가지고 있지 않기 때문

🤔 변수 user에 저장된 객체의 구조를 그대로 타입으로 만들려면 어떻게 해야 할까? 

 

2️⃣ 객체 리터럴 타입

중괄호를 열고 객체가 갖는 프로퍼티를 직접 내열해 만드는 타입

let user: {
  id: number;
  name: string;
} = {
  id: 1,
  name: "kim",
};

user.id; //오류x

 

😀 타입스크립트의 구조적 타입 시스템

  • 타입스크립트는 기존의 정적 타입 언어(C, JAVA)와 달리, 객체의 타입을 정의할 때 프로퍼티를 기준으로 객체의 구조를 정의하듯이 타입을 정의한다.
  • 객체에 어떤 프로퍼티가 있어야 하는지 정의하는 방식으로 객체의 타입을 정의한다.

✅ 특수한 프로퍼티 정의하기

선택적 프로퍼티(Optional Property)

특정 프로퍼티를 상황에 따라 생략하도록 만들고 싶다면

해당 프로퍼티 이름 뒤에 `?`를 붙여 선택적 프로퍼티로 만들어 주면 된다. 

let user: {
  id?: number; // 선택적 프로퍼티가 된 id
  name: string;
} = {
  id: 1,
  name: "kim",
};

user = {
  name: "lee",
};

 

읽기전용 프로퍼티(Readonly Property)

특정 프로퍼티를 읽기 전용으로 만들고 싶다면 프로퍼티의 이름 앞에 `readonly` 키워드를 붙이면 된다.

let user: {
  id?: number;
  readonly name: string; // name은 이제 Readonly 프로퍼티가 되었음
} = {
  id: 1,
  name: "kim",
};

user.name = "dskfd"; // 오류 발생

 

 

4. 타입 별칭과 인덱스 시그니쳐

  • 타입 별칭: 변수처럼 타입 정의를 할 수 있게 해주는 문법
  • 인덱스 시그니쳐: 객체 타입을 좀 더 유연하게 정의하도록 도와주는 문법

✅ 타입 별칭(Type Alias)

type User = {
  id: number;
  name: string;
  nickname: string;
  birth: string;
  bio: string;
  location: string;
};

// type User = {} 동일 스코프에 동일한 이름의 타입 별칭 선언 불가
  • 변수를 선언하듯 타입을 별도로 정의할 수 있다.
  • `type 타입이름 = 타입` 형태로 타입을 정의한다.
  • 동일한 스코프에 동일한 이름의 타입 별칭을 선언하는 것은 불가능하다.(변수와 동일)
  • 타입별칭은 컴파일하면 사라진다.

✅ 인덱스 시그니처(Index Signature)

객체 타입을 유연하게 정의할 수 있도록 돕는 특수한 문법

type CountryCodes = {
  Korea: string;
  UnitedState: string;
  UnitedKingdom: string;
  // (... 약 100개의 국가)
  Brazil : string
};

let countryCodes: CountryCodes = {
  Korea: "ko",
  UnitedState: "us",
  UnitedKingdom: "uk",
  // (... 약 100개의 국가)
  Brazil : 'bz'
};

위와 같이 국가들의 영어 코드를 저장하는 객체가 있다고 가정했을 때,

100개의 프로퍼티를 추가하면 타입 정의에도 각 프로퍼티를 모두 정의해 주어야 한다.

이 경우 코드가 매우 길어지고 코드 작성에 불편함을 겪을 수 있다.

이럴 때 인덱스 시그니쳐를 사용하면 간단하게 타입 정의가 가능하다.

type CountryCodes = {
  [key: string]: string;
};

let countryCodes: CountryCodes = {
  Korea: "ko",
  UnitedState: "us",
  UnitedKingdom: "uk",
  // (... 약 100개의 국가)
  Brazil : 'bz'
};

`[key:string]: string`: 이 객체 타입에는 key가 string 타입이며 value가 string 타입인 모든 프로퍼티가 포함된다는 의미의 인덱스 시그니쳐 문법.

 

type CountryCodes = {
  [key: string]: string;
  Korea: string; //반드시 포함해야 하는 프로퍼티가 있다면 직접 명시도 가능
  //korea: number; //불가!
};

let countryCodes: CountryCodes = {
  Korea: "ko",
  UnitedState: "us",
  UnitedKingdom: "uk",
  // (... 약 100개의 국가)
  Brazil : 'bz'
};

반드시 포함해야 하는 프로퍼티가 있다면 `Korea: string;`처럼 직접 타입을 명시할 수도 있다.

 

🚫 주의 🚫

인덱스 시그니쳐를 사용하면서 추가적으로 프로퍼티를 명시할 때는

인덱스 시그니쳐의 value 타입과 직접 추가한 프로퍼티의 value 타입이 호환되거나 일치해야 한다.

 

 

5. 열거형 타입

✅ 열거형(Enum) 타입

  • 자바스크립트에는 존재하지 않음 👉 타입스크립트에서만 사용 가능한 특별한 타입
  • 여러 개의 값을 나열하는 용도로 사용
enum Role {
  ADMIN,
  USER,
  GUEST,
}
//enum 각 멤버에 숫자 할당 가능
enum Role {
  ADMIN = 0,
  USER = 1,
  GUEST = 2,
}

const user1 = {
  name: "kim",
  role: Role.ADMIN, //관리자
};

const user2 = {
  name: "lee",
  role: Role.USER, // 회원
};

const user3 = {
  name: "park",
  role: Role.GUEST, // 게스트
};
  • user1.role에는 0, user2.role에는 1, user3.role에는 2가 할당된다. 
  • 유저의 권한과 같은 여러 개의 멤버를 갖는 값을 숫자로 표기할 때 enum을 사용하면 보다 안전하고 직관적인 데이터 관리가 가능하다.
  • enum 멤버에 숫자 값을 할당하지 않으면 기본적으로 0부터 1씩 늘어나며 자동으로 값이 할당된다.
  • 만약 특정 숫자부터 값을 할당하고 싶다면 시작 숫자를 직접 할당해 주면 된다.
enum Role {
  ADMIN = 10, // 10 할당 
  USER,       // 11 할당(자동)
  GUEST,      // 12 할당(자동)
}

const user1 = {
  name: "kim",
  role: Role.ADMIN, // 10
};

const user2 = {
  name: "lee",
  role: Role.USER, // 11
};

const user3 = {
  name: "park",
  role: Role.GUEST, // 12
};

이렇게 멤버의 값이 모두 숫자인 enum을 숫자형 enum 혹은 숫자 열거형 타입이라 한다.

 

✅ 문자열 열거형

enum Language {
  korean = "ko",
  english = "en",
}
  • enum의 멤버에 문자열 값을 할당할 수도 있다.
  • 모든 멤버의 갑싱 문자열 값인 enum을 문자열 enum이라고 부른다.
  • 숫자형 enum과 동일하게 프로퍼티의 값으로 사용가능하다.
enum Role {
  ADMIN,
  USER,
  GUEST,
}

enum Language {
  korean = "ko",
  english = "en",
}

const user1 = {
  name: "kim",
  role: Role.ADMIN, // 0
  language: Language.korean,// "ko"
};

문자열 enum을 사용하면 user1.language 같은 프로퍼티에 "ko"를 "kos"와 같이 작성하는 오타를 낸다거나 값을 헷갈려 다른 문자열을 적어 넣는 등의 실수를 방지할 수 있다.

 

✅ enum은 컴파일 결과 객체가 된다.

enum은 컴파일 시 다른 타입들처럼 사라지지 않고 자바스크립트 객체로 변환된다.

var Role;
(function (Role) {
    Role[Role["ADMIN"] = 0] = "ADMIN";
    Role[Role["USER"] = 1] = "USER";
    Role[Role["GUEST"] = 2] = "GUEST";
})(Role || (Role = {}));
var Language;
(function (Language) {
    Language["korean"] = "ko";
    Language["english"] = "en";
    Language["japanese"] = "jp";
})(Language || (Language = {}));
const user1 = {

 

 
 

출처

 

[이정환] 한 입 크기로 잘라먹는 TypeScript 핸드북 내용정리 2. 타입스크립트 기본 1(0. 기본타입의

chapter 2. 타입스크립트 기본 0. 기본 타입(Basic Types) 이란? TS가 자체적으로 제공하는 타입, 내장 타입 TS에서만 제공하는 타입: any, void, never, unknown 타입 계층도: TS가 제공하는 기본 타입들을 계층

florescene.tistory.com

 

한 입 크기로 잘라먹는 타입스크립트(TypeScript) | 이정환 Winterlood - 인프런

이정환 Winterlood | 문법을 넘어 동작 원리와 개념 이해까지 배워도 배워도 헷갈리는 타입스크립트 이제 제대로 배워보세요! 여러분을 타입스크립트 마법사🧙🏻‍♀️로 만들어드립니다., 프론

www.inflearn.com

 

저작자표시 비영리 변경금지 (새창열림)

'웹 프로그래밍 > JavaScript | TypeScript' 카테고리의 다른 글

[한 입 크기로 잘라먹는 TypeScript] CH3. 타입스크립트 이해하기 1(1. 타입은 집합이다, 2. 타입 계층도와 함께 기본타입 살펴보기)  (0) 2024.04.15
[한 입 크기로 잘라먹는 TypeScript] CH2. 타입스크립트 기본 3(6.any와 unknown, 7.void와 never)  (0) 2024.04.11
[한 입 크기로 잘라먹는 TypeScript] CH2. 타입스크립트 기본 1(0. 기본타입의 정의, 1.원시타입과 리터럴타입, 2.배열과 튜플)  (0) 2024.04.05
[한 입 크기로 잘라먹는 TypeScript] CH1. 타입스크립트 개론 2(2. TS 동작원리, 3. 설치와 실습, 4. 컴파일러 옵션 설정하기)  (0) 2024.04.03
[한 입 크기로 잘라먹는 TypeScript] CH1. 타입스크립트 개론 1(0. 타입스크립트 소개, 1. JS 단점/TS 장점)  (1) 2024.04.02
[모던 자바스크립트 Deep Dive] 12장. 함수1 (12.1. 함수란? ~ 12.4. 함수 정의)  (1) 2024.03.29
'웹 프로그래밍/JavaScript | TypeScript' 카테고리의 다른 글
  • [한 입 크기로 잘라먹는 TypeScript] CH3. 타입스크립트 이해하기 1(1. 타입은 집합이다, 2. 타입 계층도와 함께 기본타입 살펴보기)
  • [한 입 크기로 잘라먹는 TypeScript] CH2. 타입스크립트 기본 3(6.any와 unknown, 7.void와 never)
  • [한 입 크기로 잘라먹는 TypeScript] CH2. 타입스크립트 기본 1(0. 기본타입의 정의, 1.원시타입과 리터럴타입, 2.배열과 튜플)
  • [한 입 크기로 잘라먹는 TypeScript] CH1. 타입스크립트 개론 2(2. TS 동작원리, 3. 설치와 실습, 4. 컴파일러 옵션 설정하기)
청량리 물냉면
청량리 물냉면
프로그래밍 공부를 하고 있습니다. 공부 내용 정리 겸 정보 공유를 목적으로 합니다.
  • 청량리 물냉면
    노력중인 블로그
    청량리 물냉면
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 프로그래밍
        • Programming
        • C | C++
        • Java
        • Python
      • 웹 프로그래밍
        • HTML | CSS
        • JavaScript | TypeScript
        • React
        • Vue.js
        • Next.js
        • Spring & Spring Boot
        • JSP & Servlet
        • DB
      • 웹 프로젝트
        • 웹 프로젝트
        • 🥨스낵몰
        • 👨‍👨‍👧‍👧소셜 가계부
        • 🌜꿈 일기장
        • 🔮포트폴리오 사이트
        • 🏃‍♂️팀 프로젝트: 일정관리 프로그램
        • 📈팀 프로젝트: AI기반 주식 분석 플랫폼
        • 😺Just Meow It: 고양이의 조언
      • 앱 프로그래밍
        • Flutter
        • Kotlin
      • Problem Solving
        • 백준
        • 프로그래머스
        • SWEA
      • Computer Science
        • 알고리즘
        • 컴퓨터 네트워크
        • 이산수학
      • Developer
        • 후기
        • 자료정리
        • 취업 | 취준
        • 웹개발 교육 프로그램
        • TIL
  • 블로그 메뉴

    • 홈
    • Github
  • 공지사항

    • 프로그래밍 공부 중😊
  • 인기 글

  • 태그

    프로그래머스
    백준
    블로그 제작
    React
    Til
    웹사이트
    Next.js
    AWS
    공식문서
    ZeroCho
    리액트
    알고리즘
    SWEA
    포트폴리오
    타입스크립트
    파이썬
    mysql
    프로젝트
    d3
    클론 프로젝트
    bfs
    spring boot
    강의내용정리
    구현
    자바
    뉴렉처
    Jiraynor Programming
    자바스크립트
    플러터
    컴퓨터네트워크
  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
청량리 물냉면
[한 입 크기로 잘라먹는 TypeScript] CH2. 타입스크립트 기본 2(3.객체, 4.타입 별칭과 인덱스 시그니쳐, 5.열거형 타입)
상단으로

티스토리툴바