Cara menghapus kunci secara dinamis dari objek yang diketik di TypeScript
Bagaimana cara menghapus kunci secara dinamis dari objek yang diketik?
Misalnya, antarmuka saya QUERY_PARAMS
adalah:
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;
}
Kode saya untuk mencoba menghapus kunci secara dinamis:
async getAllImages(inputParams: QUERY_PARAMS) {
for (let key in inputParams) {
if (!inputParams[key]) {
delete inputParams[key]
}
}
// ...
}
Ini melempar kesalahan:
elemen secara implisit memiliki tipe 'any' karena ekspresi tipe 'string' tidak dapat digunakan untuk tipe indeks 'QUERY_PARAMS'. Tidak ada tanda tangan indeks dengan parameter jenis 'string' yang ditemukan pada jenis 'QUERY_PARAMS'
Jawaban
Kesalahan ini karena key
adalah string, yang tidak cukup spesifik untuk dijadikan atribut inputParams
, yaitu keyof QUERY_PARAMS
. Saat ini TS tidak mengizinkan Anda untuk menentukan tipe untuk variabel iterasi dari sebuah for
loop ( masalah # 3500 ), tetapi Anda dapat melakukan pernyataan tipe pada kunci di dalam loop:
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' }