Comment supprimer dynamiquement les clés d'un objet typé dans TypeScript

Aug 16 2020

Comment puis-je supprimer dynamiquement les clés d'un objet typé ?

Par exemple, mon interface QUERY_PARAMSest :

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

1 bsapaka Aug 16 2020 at 01:16

L'erreur est due au fait keyqu'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 forboucle ( 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' }