3 votes

Typescript assigne à un objet des propriétés qui n'existent pas dans la définition du type de l'objet

Je ne comprends pas pourquoi Typescript ne signale pas cela comme une erreur ...

Quand j'ajoute conditionnellement une nouvelle propriété à un objet qui n'existe pas dans la définition du type de cet objet, Typescript l'assigne

  type Filters = {
      keywords: Array
    }

    const condition = 1;

    let filters: Filters = {keywords: ['keyword']}

    filters = {
      ...filters,
        ...(condition && {...{ tags: ['tag']}}),
      }

Résultats:

filters: {
  keywords:["keyword"]
  tags:["tag"]
}

Alors que je m'attendais à obtenir cette erreur:

Object literal may only specify known properties, and 'tags' does not exist in type 'Filters'.

PS : J'obtiens l'erreur attendue lorsque j'essaie d'ajouter la même propriété de cette manière :

filters = {...filters, tags: ['tag']}

1voto

jcalz Points 30410

C'est actuellement une fonction manquante de TypeScript; les vérifications de propriété excessive ne se produisent que dans certains contextes, et jusqu'à présent personne n'a mis en œuvre le type de vérification contextuelle du contenu des objets en ligne qui sont étendus dans des objets externes.

Il y a une demande de fonctionnalité ouverte à ce sujet sur microsoft/TypeScript#39998. Elle est actuellement marquée comme "En attente de plus de retours", vous voudrez peut-être aller sur cette question, lui donner une , et décrire dans un commentaire votre cas d'utilisation et pourquoi il est convaincant. Je doute que prendre une telle action ait beaucoup d'effet, mais cela ne ferait pas de mal.


Autant que je sache, il n'y a pas de super solution de contournement pour vous donner ce comportement. Si vous souhaitez utiliser une fonction d'aide comme

const noExcess = () =>
  (u: U) => u;

Et la spécialiser pour Filtres:

const noExcessFilters = noExcess();

Et puis l'appeler:

const z = noExcessFilters({
  ...filtres,
  ...(condition && { tags: ['tag'] }),
}); // erreur!   Les types de propriété 'tags' sont incompatibles.

il signalera des situations comme celle-ci, mais je ne sais pas si cela en vaut la peine pour vous.

Lien vers le code dans le bac à sable

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X