Come rimuovere dinamicamente le chiavi da un oggetto digitato in TypeScript
Come posso rimuovere dinamicamente le chiavi da un oggetto digitato?
Ad esempio, la mia interfaccia 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;
}
Il mio codice per provare a eliminare dinamicamente le chiavi:
async getAllImages(inputParams: QUERY_PARAMS) {
for (let key in inputParams) {
if (!inputParams[key]) {
delete inputParams[key]
}
}
// ...
}
Genera l'errore:
L'elemento ha implicitamente un tipo 'any' perché l'espressione di tipo 'string' non può essere utilizzata per indicizzare il tipo 'QUERY_PARAMS'. Non è stata trovata alcuna firma di indice con un parametro di tipo 'stringa' nel tipo 'QUERY_PARAMS'
Risposte
L'errore è dovuto al fatto key
che è una stringa, che non è sufficientemente specifica per essere un attributo di inputParams
, ad es keyof QUERY_PARAMS
. Attualmente TS non ti consente di definire un tipo per la variabile di iterazione di un for
ciclo ( issue#3500 ), ma puoi fare un'asserzione di tipo sulla chiave all'interno del ciclo:
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' }