Как динамически удалять ключи из типизированного объекта в 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' }