const category = Object.entries(CategoryEnum).find(
(item) => item[0] === this.review.category
);
const property = category![0].toLowerCase();
this.review.restaurant;
console.log(this.review[property as keyof IReviewDTO]);
setRegion(review: IReviewDTO): string {
let result: string = '';
Object.entries(this.category).map(([key, value]) => {
if (review.category === key) {
const _key = key.toLowerCase();
const data = (review as any)[_key];
result = `${data.bjdong.sigungu.sido.name} ${data.bjdong.sigungu.name} ${data.bjdong.name}`;
}
});
return result;
}
as keyof IReviewDTO
는 TypeScript에서 타입 단언(Type Assertion) 구문으로, 해당 값이 IReviewDTO
인터페이스의 키(key)로 유효하다고 명시적으로 선언하는 것을 의미합니다. 이를 통해 TypeScript에게 프로퍼티의 유효성을 보장할 수 있습니다.
구체적으로 분석해보겠습니다.
const category = Object.entries(CategoryEnum).find(
(item) => item[0] === this.review.category
);
const property = category![0].toLowerCase();
this.review.restaurant;
console.log(this.review[property as keyof IReviewDTO]);
category
변수에는 CategoryEnum
객체의 프로퍼티와 값을 가지는 배열이 할당됩니다. 배열의 첫 번째 요소(category![0]
)는 프로퍼티 이름을 나타냅니다.property
변수에는 category![0]
의 값인 프로퍼티 이름이 소문자로 변환되어 할당됩니다.this.review.restaurant
는 타입 에러가 발생하지 않는 이유는 restaurant
가 IReviewDTO
인터페이스에 존재하는 프로퍼티로 타입이 정의되어 있기 때문입니다. 따라서 TypeScript가 해당 프로퍼티에 대한 타입을 알고 있으므로 에러가 발생하지 않습니다.this.review[property as keyof IReviewDTO]
에서 as keyof IReviewDTO
는 property
변수의 값을 IReviewDTO
인터페이스의 키로 간주하도록 타입 단언을 수행합니다. 이를 통해 TypeScript에게 해당 키가 IReviewDTO
에 존재한다는 정보를 전달하여 타입 에러를 방지합니다.as keyof IReviewDTO
를 사용하여 프로퍼티 이름을 타입 단언하는 것은 해당 프로퍼티의 유효성을 명시적으로 보장하기 위한 방법입니다. 이를 통해 프로퍼티에 접근하는 코드에서 타입 안정성을 유지할 수 있습니다.