टाइपस्क्रिप्ट में टाइप की गई वस्तु से कुंजियों को गतिशील रूप से कैसे हटाएं

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]
       }
     }
     // ...
  }

यह त्रुटि फेंकता है:

तत्व का स्पष्ट रूप से एक 'कोई' प्रकार होता है, क्योंकि 'string' प्रकार की अभिव्यक्ति का उपयोग 'QUERY_PARAMA' टाइप करने के लिए नहीं किया जा सकता है। '' QUERY_PARAMS 'प्रकार पर' स्ट्रिंग 'के पैरामीटर के साथ कोई सूचकांक हस्ताक्षर नहीं मिला

जवाब

1 bsapaka Aug 16 2020 at 01:16

त्रुटि इसलिए है क्योंकि keyयह एक स्ट्रिंग है, जो विशिष्ट होने के लिए पर्याप्त नहीं है inputParams, अर्थात keyof QUERY_PARAMS। वर्तमान में टीएस आपको 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' }