So entfernen Sie Schlüssel dynamisch von einem typisierten Objekt in TypeScript
Wie kann ich Schlüssel dynamisch von einem getippten Objekt entfernen?
Meine Schnittstelle QUERY_PARAMS
ist zum Beispiel:
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;
}
Mein Code für den Versuch, Schlüssel dynamisch zu löschen:
async getAllImages(inputParams: QUERY_PARAMS) {
for (let key in inputParams) {
if (!inputParams[key]) {
delete inputParams[key]
}
}
// ...
}
Es wirft den Fehler:
Das Element hat implizit den Typ „beliebig“, da der Ausdruck vom Typ „Zeichenfolge“ nicht zum Indizieren des Typs „QUERY_PARAMS“ verwendet werden kann. Es wurde keine Indexsignatur mit einem Parameter vom Typ „Zeichenfolge“ für den Typ „QUERY_PARAMS“ gefunden.
Antworten
Der Fehler liegt daran , dass key
es sich um eine Zeichenfolge handelt, die nicht spezifisch genug ist, um ein Attribut von zu sein inputParams
, dh keyof QUERY_PARAMS
. Derzeit erlaubt Ihnen TS nicht, einen Typ für die Iterationsvariable einer for
Schleife zu definieren ( issue#3500 ), aber Sie können eine Typzusicherung für den Schlüssel innerhalb der Schleife durchführen:
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' }