Cómo eliminar dinámicamente las claves de un objeto escrito en TypeScript
¿Cómo puedo eliminar dinámicamente las claves de un objeto escrito?
Por ejemplo, mi interfaz QUERY_PARAMS
es:
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;
}
Mi código para intentar eliminar claves dinámicamente:
async getAllImages(inputParams: QUERY_PARAMS) {
for (let key in inputParams) {
if (!inputParams[key]) {
delete inputParams[key]
}
}
// ...
}
Me tira el error:
implícitamente tiene un tipo 'cualquiera' porque la expresión de tipo 'cadena' no se puede usar para indexar el tipo 'QUERY_PARAMS'. No se encontró ninguna firma de índice con un parámetro de tipo 'cadena' en el tipo 'QUERY_PARAMS'
Respuestas
El error se debe a que key
es una cadena que no es lo suficientemente específica para ser un atributo de inputParams
, es decir keyof QUERY_PARAMS
. Actualmente, TS no le permite definir un tipo para la variable de iteración de un for
ciclo ( problema #3500 ), pero puede hacer una afirmación de tipo en la clave dentro 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' }