टाइपस्क्रिप्ट में टाइप की गई वस्तु से कुंजियों को गतिशील रूप से कैसे हटाएं
मैं टाइप की गई वस्तु से गतिशील रूप से चाबियाँ कैसे निकाल सकता हूं?
उदाहरण के लिए, मेरा इंटरफ़ेस 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 'प्रकार पर' स्ट्रिंग 'के पैरामीटर के साथ कोई सूचकांक हस्ताक्षर नहीं मिला
जवाब
त्रुटि इसलिए है क्योंकि 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' }