Como remover chaves dinamicamente de um objeto digitado no TypeScript
Como posso remover chaves dinamicamente de um objeto digitado?
Por exemplo, minha interface 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;
}
Meu código para tentar excluir chaves dinamicamente:
async getAllImages(inputParams: QUERY_PARAMS) {
for (let key in inputParams) {
if (!inputParams[key]) {
delete inputParams[key]
}
}
// ...
}
Ele lança o erro:
elemento tem implicitamente um tipo 'any' porque a expressão do tipo 'string' não pode ser usada para indexar o tipo 'QUERY_PARAMS'. Nenhuma assinatura de índice com um parâmetro do tipo 'string' foi encontrada no tipo 'QUERY_PARAMS'
Respostas
O erro é porque key
é uma string, que não é específica o suficiente para ser um atributo de inputParams
, ou seja keyof QUERY_PARAMS
. Atualmente o TS não permite que você defina um tipo para a variável de iteração de um for
loop ( issue#3500 ), mas você pode fazer uma declaração de tipo na chave dentro do 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' }