let employee = {
id: 1
}
// 오브젝트 프로퍼티 타입 지정
let employee: {
id: number
} = { id: 1 };
employee
객체에 name
프로퍼티를 만들어보자.
employee.name = 'Kim';
// Property 'name' does not exist on type { id: number }.
employee.name = 'Kim';
// Property 'name' is missing in type '{ id: number }'.
let employee: {
id: number,
name: string
} = { id: 1 }
// 정상 작동
let employee: {
id: number,
name: string
} = { id: 1, name: 'Kim' };
// 정상 작동하나 피해야할 스타일
let employee: {
id: number,
name?: string
} = { id: 1 }
?
optional chaining
연산자를 써서 name
프로퍼티의 부재에 대한 에러를 회피하지만
name
프로퍼티가 부재할 경우에 employee
타입에 name: string
을 설정해둔 것이 말이 안되기 때문.
let employee: {
id: number,
name: string
} = { id: 1, name: 'Kim'};
// id값 변경 가능
employee.id = 0;
만약 오브젝트의 프로퍼티 값이 변경되는 것을 방지하고자 한다면 readonly
를 추가할 수 있다.
let employee: {
readonly id: number,
name: string
} = {
id: 1,
name: 'Kim'
};
// 에러
employee.id = 0;
let employee: {
readonly id: number,
name: string,
retire: (date: Date) => void
} = {
id: 1,
name: 'Kim',
retire: (date: Date) => {
console.log(date);
}
}
retire
메서드를 추가했다. 인자로 들어갈 date: Date
를 넣고 =>
화살표 다음에 void
리턴될 타입을 지정해준다. 이 코드에서는 아무것도 리턴하지 않을 것이니 void
를 넣어줬다.
이제 오브젝트에 메서드까지 등록하는 것을 배웠다. 그러나 코드가 좀 복잡해지기 시작했고 만약 같은 프로퍼티를 가지는 오브젝트를 여러개 만든다고 가정해보자. 그러면 코드는 매우 복잡해지고 타입 지정 부분에서 똑같은 코드를 계속 반복해야하는 비효율성이 부각될 것이다.
위의 일회성 타입 지정을 극복하고자 type alias
가 등장한다.
// type alias
type Employee {
readonly id: number,
name: string,
retire: (date: Date) => void
}
let employee: Employee = {
id: 1,
name: 'Kim',
retire: (date: Date) => {
console.log(date);
}
}
let employee2: Employee = {
id: 2,
name: 'Jun',
retire: (date: Date) => {
console.log(date);
}
}
Employee
라는 타입이 지정되었고 이제 오브젝트들은 그냥 저 type alias
인 Employee
를 가져다 쓰기만 하면 된다. 코드의 효율성이 대폭 증가했다.