let user: object = {
id: 1,
name: "Muzi",
};
→ 그러나 이런 방식에서는 user.id
처럼 점 표기법으로 특정 프로퍼티에 접근할 경우 오류가 발생하며, “’object’ 타입에 ‘id’ 프로퍼티가 없다”는 메시지가 뜬다.
✅ 타입스크립트의 object 타입은 단순 값이 객체임을 표현하는 것 이외에 아무런 정보도 제공하지 않아 프로퍼티에 대한 정보는 가지고 있지 않다. 따라서 프로퍼티에 접근하려고 하면 문제 발생!
let user: {id: number, name: string} = {
id: 1,
name: "Muzi",
};
객체 리터럴 타입으로 객체를 정의하면 타입 내에 정의된 프로퍼티에도 문제 없이 접근이 가능해진다. 따라서 이 방법을 애용하도록 하자.
💡 구조적 타입 시스템
타입스크립트는 기존의 정적 타입 시스템을 따르는 언어인 C나 Java와는 달리 객체의 타입을 정의할 때 프로퍼티를 기준으로 객체의 구조를 정의하 듯이 타입을 정의한다.
JS에서 객체를 다루다보면 자주 특정 프로퍼티는 무의미해지는 상황이 존재
let user: {
id: number;
name: string;
} = {
id: 1,
name: "무지",
};
user = {
name: "라이언", // 오류 발생!
};
user
객체에 name
프로퍼티만 있게 된다면 오류가 발생한다. 타입 선언은 id
까지 했기 때문에 프로퍼티가 부족하기 때문이다. 따라서 이럴 경우 선택적 프로퍼티로 만들어주어야한다.
let user: {
// 선택적 프로퍼티로 만들기 위해 '?:'로 타입 선언
id?: number;
name: string;
} = {
id: 1,
name: "라이언",
};
물음표는 해당 프로퍼티가 Optional 프로퍼티라는 의미로 붙여준다.
let user: {
id?: number;
readonly name: string; // name은 이제 Readonly 프로퍼티가 되었음
} = {
id: 1,
name: "무지",
};
user.name = "라이언"; // 오류!
읽기 전용 프로퍼티는 프로퍼티 값 수정이 불가능하므로 의도치 않은 수정을 방지할 때 사용한다.