วิธีลบคีย์แบบไดนามิกจากวัตถุที่พิมพ์ใน TypeScript
ฉันจะลบคีย์ออกจากวัตถุที่พิมพ์แบบไดนามิกได้อย่างไร?
ตัวอย่างเช่นอินเทอร์เฟซของฉัน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
ข้อผิดพลาดเป็นเพราะ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' }