วิธีลบคีย์แบบไดนามิกจากวัตถุที่พิมพ์ใน 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'

คำตอบ

1 bsapaka Aug 16 2020 at 01:16

ข้อผิดพลาดเป็นเพราะkeyเป็นสตริงซึ่งไม่เฉพาะเจาะจงมากพอที่จะเป็นแอตทริบิวต์คือinputParams keyof QUERY_PARAMSปัจจุบัน TS ไม่อนุญาตให้คุณกำหนดประเภทสำหรับตัวแปรการวนซ้ำของforลูป ( ปัญหา # 3500 ) แต่คุณสามารถยืนยันประเภทบนคีย์ภายในลูปได้:

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' }