4장 객체
객체 리터럴은 각자의 타입이 있는 키와 값의 집합이다.
4.1 객체 타입
{ ... }
구문을 사용해서 객체 리터럴을 생성하면 타입스크립트는 해당 속성을 기반으로 새로운 객체 타입 또는 타입 형태를 고려한다. 해당 객체 타입은 객체의 값과 동일한 속성명과 원시 타입을 갖는다.
const poet = {
born: 1935,
name: 'Mary Oliver',
};
poet['born']; // number
poet.name; // string
poet.end; // ERROR
null
과 undefined
를 제외한 모든 값은 그 값에 대한 실제 타입의 멤버 집합을 가지므로 타입스크립트는 모든 값의 타입을 확인하기 위해 객체 타입을 이해해야 한다.
4.1.1 객체 타입 선언
객체 타입은 객체 리터럴과 유사하게 보이지만 필드 값 대신 타입을 사용해 설명한다.
let poetLater: {
born: number;
name: string;
};
poetLater = {
born: 1935,
name: 'Mary Oliver',
};
poetLater = 'Sappho'; // ERROR
4.1.2 별칭 객체 타입
타입 별칭을 사용하면 타입스크립트의 할당 가능성 오류 메시지를 조금 더 직접적으로 읽기 쉽게 만드는 이점이 있다.
type Poet = {
born: number;
name: string;
};
let poetLater: Poet;
// OK
poetLater = {
born: 1935,
name: 'Sara Teasdale',
};
// ERROR
poetLater = 'Emily Dickinson';
4.2 구조적 타이핑
타입스크립트의 타입 시스템은 구조적으로 타입화되어 있다. 타입을 충족하는 모든 값을 해당 타입의 값으로 사용할 수 있다. 매개변수나 변수가 특정 객체 타입으로 선언되면 타입스크립트에 어떤 객체를 사용하든 해당 속성이 있어야 한다고 말해야 한다.
type WithFirstName = {
firstName: string;
};
type WithLastName = {
lastName: string;
};
const hasBoth = {
firstName: 'Lucille',
lastName: 'Clifton',
};
let withFirstName: WithFirstName = hasBoth; // OK
let withLastName: WithLastName = hasBoth; // OK
구조적 타이핑은 덕 타이핑과 다르다.
- 구조적 타이핑: 타입스크립트의 타입 검사기에서 정적 시스템이 타입을 검사하는 것(타입스크립트)
- 덕 타이핑: 런타임에서 사용될 때까지 객체 타입을 검사하지 않는 것(자바스크립트)
노트
타입스크립트 공식 문서에서는 구조적 타이핑과 덕 타이핑을 구분하지 않는다.