Jak dynamicznie usuwać klucze z wpisanego obiektu w TypeScript
Aug 16 2020
Jak mogę dynamicznie usuwać klucze z wpisanego obiektu?
Na przykład mój interfejs QUERY_PARAMS
to:
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;
}
Mój kod do próby dynamicznego usuwania kluczy:
async getAllImages(inputParams: QUERY_PARAMS) {
for (let key in inputParams) {
if (!inputParams[key]) {
delete inputParams[key]
}
}
// ...
}
Wyrzuca błąd:
element niejawnie ma typ „any”, ponieważ wyrażenie typu „string” nie może być użyte do indeksowania typu „QUERY_PARAMS”. Nie znaleziono podpisu indeksu z parametrem typu „string” w typie „QUERY_PARAMS”
Odpowiedzi
1 bsapaka Aug 16 2020 at 01:16
Błąd wynika z tego, że key
jest to ciąg znaków, który nie jest wystarczająco szczegółowy, aby być atrybutem inputParams
, tj keyof QUERY_PARAMS
. Obecnie TS nie pozwala na zdefiniowanie typu dla zmiennej iteracyjnej for
pętli ( numer 3500 ), ale możesz wykonać asercję typu na kluczu wewnątrz pętli:
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' }