Comment supprimer dynamiquement les clés d'un objet typé dans TypeScript
Comment puis-je supprimer dynamiquement les clés d'un objet typé ?
Par exemple, mon interface QUERY_PARAMS
est :
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;
}
Mon code pour essayer de supprimer dynamiquement des clés :
async getAllImages(inputParams: QUERY_PARAMS) {
for (let key in inputParams) {
if (!inputParams[key]) {
delete inputParams[key]
}
}
// ...
}
Il jette l'erreur:
L'élément a implicitement un type 'any' car l'expression de type 'string' ne peut pas être utilisée pour indexer le type 'QUERY_PARAMS'. Aucune signature d'index avec un paramètre de type 'chaîne' n'a été trouvée sur le type 'QUERY_PARAMS'
Réponses
L'erreur est due au fait key
qu'il s'agit d'une chaîne qui n'est pas suffisamment spécifique pour être un attribut de inputParams
, c'est-à-dire keyof QUERY_PARAMS
. Actuellement, TS ne vous permet pas de définir un type pour la variable d'itération d'une for
boucle ( issue#3500 ), mais vous pouvez faire une assertion de type sur la clé à l'intérieur de la boucle :
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' }