TypeScript의 형식화 된 개체에서 키를 동적으로 제거하는 방법

Aug 16 2020

유형이 지정된 개체에서 키를 동적으로 제거하려면 어떻게해야합니까?

예를 들어, 내 인터페이스 QUERY_PARAMS는 다음과 같습니다.

export interface QUERY_PARAMS {
  query: string;
  min_height?: string;
  max_height?: string;
  min_width?: string;
  max_width?: string;
  color?: string;
  image_type?: IMAGETYPE;
  order?: ORDER;
  orientation?: ORIENTATION;
}

키를 동적으로 삭제하려는 내 코드 :

  async getAllImages(inputParams: QUERY_PARAMS) {
     for (let key in inputParams) {
       if (!inputParams[key]) {
         delete inputParams[key]
       }
     }
     // ...
  }

오류가 발생합니다.

'문자열'유형의 표현식은 'QUERY_PARAMS'유형을 색인화하는 데 사용할 수 없기 때문에 요소에 암시 적으로 '모든'유형이 있습니다. 'QUERY_PARAMS'유형에 'string'유형의 매개 변수가있는 색인 서명이 없습니다.

답변

1 bsapaka Aug 16 2020 at 01:16

오류는 , 즉 key의 속성이 될만큼 구체적이지 않은 문자열 이기 때문 입니다 . 현재 TS에서는 루프 ( issue # 3500 ) 의 반복 변수에 대한 유형을 정의 할 수 없지만 루프 내부의 키에 대해 유형 어설 션을 수행 할 수 있습니다.inputParamskeyof QUERY_PARAMSfor

export interface QUERY_PARAMS {
  query: string;
  min_height?: string;
  // ...
}

async function getAllImages(inputParams: QUERY_PARAMS) {
  for (let key in inputParams) {
    const k = key as keyof QUERY_PARAMS; // <-- type assertion
    if (!inputParams[k]) {
      delete inputParams[k]
    }
  }

  // ...
}

const p: QUERY_PARAMS = {
  query: 's',
  min_height: undefined,
}

console.log(p); // { query: 's', min_height: undefined }

getAllImages(p);

console.log(p); // { query: 's' }