객체

woodstock·2023년 12월 7일
0
post-thumbnail

객체


https://github.com/winterlood/onebite-typescript/blob/main/section2/src/chapter3.ts

객체 타입을 정의하는 방법

Object로 정의하기

let user: object = {
  id: 1,
  name: 'woodstock',
};

타입스크립트의 object타입은 단순 값이 객체임을 표현하는 것 외에는 아무런 정보도 제공하지 않는다.

따라서 이 타입은 객체의 프로퍼티에 대한 정보를 가지고 있지 않기 때문에 위와 같이 프로퍼티에 접근하려고 하면 오류가 발생한다.

이를 해결하려면 객체 리터럴 타입을 이용해야 한다.

객체 리터럴 타입

객체 리터럴 타입은 다음과 같이 중괄호를 열고 객체가 갖는 프로퍼티를 직접 나열해 만드는 타입이다.

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


변수의 타입을 객체 리터럴 타입으로 정의하면 타입내에 정의되어있는 프로퍼티에 이상 없이 접근할 수 있게 되고, 위와같이 프로터피 값의 타입도 잘 나타난다.

따라서, 객체의 타입을 정의할 때에는 object보다는 객체 리터럴 타입을 사용하는 것이 좋다.

예제

let cake = {
  name: '스초생',
  brand: '투썸',
  cost: 3,
};

이 객체의 타입을 객체 리터럴 타입으로 정의하면 아래와 같다.

let cake: {
  name: string;
  brand: string;
  cost: number;
} = {
  name: "스초생",
  brand: "투썸",
  cost: 3,
};

여기서 한 가지 알 수 있는 사실은, 타입스크립트는 기존의 정적 타입 시스템을 따르는 언어인 CJava와는 달리 객체의 탕비을 정의할 때 프로퍼티를 기준으로 객체의 구조를 정의하듯이 타입을 정의한다는 점이다.

타입스크립트의 이런 특징을 구조적 타입 시스템이라고 부른다.
객체의 구조를 결정하는 것은 프로퍼티이다. 따라서, 타입스크립트는 이 객체에 어떤 프로퍼티들이 있어야 하는지 정의하는 방식으로 객체의 타입을 정의한다.
마치 namebrandcost가 잇는 객체는 케이크 타입이야 라고 보는 것과 비슷하다.

특수한 프로퍼티 정의하기

타입스크립트에서는 객체 타입을 정의할 때 특정 프로퍼티를 선택적이거나 읽기 전용으로 만들 수 있다.

선택적 프로퍼티(Optional Property)

특정 프로퍼티를 상황에 따라 생략하도록 만들고 싶다면 해당 프로퍼티의 이름 뒤에 ?를 붙여 선택적 프로퍼티로 만들면 된다.

let user: {
  id?: number; // id는 선택적 프로퍼티이다.
  name: string;
} = {
  id: 1,
  name: "woodstock",
};

// id가 없어도 에러가 발생하지 않는다.
user = {
  name: 'snoopy',
}

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

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

let config: {
  readonly apiKey: string;
} = {
  apiKey: "MY API KEY",
};

config.apiKey = "hacked"; // 에러메세지 : 읽기 전용 속성이므로 'apiKey'에 할당할 수 없습니다.

apiKey는 읽기 전용 프로퍼티이기 때문에 값을 수정하려고 하면 위와같이 오류가 발생하게 된다.

이처럼 읽기전용 프로퍼티를 사용해 의도치 않은 프로퍼티의 숮어을 방지할 수 있다.

profile
해내는 사람

0개의 댓글