객체 프로퍼티 문자열 접근

agnusdei·2023년 7월 12일
0
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]);
  1. as keyof 활용
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;
  }
  1. as any 활용

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]);
  1. category 변수에는 CategoryEnum 객체의 프로퍼티와 값을 가지는 배열이 할당됩니다. 배열의 첫 번째 요소(category![0])는 프로퍼티 이름을 나타냅니다.
  2. property 변수에는 category![0]의 값인 프로퍼티 이름이 소문자로 변환되어 할당됩니다.
  3. this.review.restaurant는 타입 에러가 발생하지 않는 이유는 restaurantIReviewDTO 인터페이스에 존재하는 프로퍼티로 타입이 정의되어 있기 때문입니다. 따라서 TypeScript가 해당 프로퍼티에 대한 타입을 알고 있으므로 에러가 발생하지 않습니다.
  4. this.review[property as keyof IReviewDTO]에서 as keyof IReviewDTOproperty 변수의 값을 IReviewDTO 인터페이스의 키로 간주하도록 타입 단언을 수행합니다. 이를 통해 TypeScript에게 해당 키가 IReviewDTO에 존재한다는 정보를 전달하여 타입 에러를 방지합니다.

as keyof IReviewDTO를 사용하여 프로퍼티 이름을 타입 단언하는 것은 해당 프로퍼티의 유효성을 명시적으로 보장하기 위한 방법입니다. 이를 통해 프로퍼티에 접근하는 코드에서 타입 안정성을 유지할 수 있습니다.

0개의 댓글