217 votes

quelle est la logique derrière l'erreur - l'opérande d'un opérateur 'delete' doit être optionnel typescript 4.0

C'est la nouvelle erreur qui apparaît dans le code typographique.

Je ne suis pas en mesure de réaliser la logique derrière cela.
Documentation

/*When using the delete operator in strictNullChecks, 
the operand must now be any, unknown, never, or be optional 
(in that it contains undefined in the type). Otherwise, use of the delete operator is an error.*/

interface Thing {
  prop: string;
}

function f(x: Thing) {
  delete x.prop; // throws error = The operand of a 'delete' operator must be optional.
}

3 votes

Votre question inclut la réponse... When using the delete operator in strictNullChecks, the operand must now be any, unknown, never, or be optional

223voto

Pac0 Points 7866

Je ne suis pas en mesure de réaliser la logique derrière cela.

La logique, telle que je la comprends, est la suivante :

Interface Thing est un contrat qui demande à avoir un (non-nul, non-indéfini) prop en tant que string .

Si l'on supprime la propriété, alors le contrat n'est plus mis en œuvre.

Si vous voulez qu'il reste valide lorsqu'il est supprimé, il suffit de le déclarer comme facultatif avec une balise ? : prop?: string

Je suis en fait surpris que cela n'ait pas causé d'erreur dans les versions précédentes de TypeScript.

7 votes

Il s'agit d'un faux positif dans un cas où vous utilisez React et souhaitez passer des props à un composant, mais ne voulez pas passer tous les props à l'élément DOM HTML car ils ne sont pas valides et vous utilisez un opérateur d'étalement pour permettre au consommateur de passer tous les attributs HTML natifs. Ensuite, vous faites une copie des props et supprimez les props inutiles.

2 votes

La vache @toni_lehtimaki c'est ma situation EXACTE... :)

1 votes

Il s'agit également d'un faux positif dans les cas où la chaîne de prototypes comprend toujours la propriété - parce que la chaîne delete ne fonctionne que sur les propriétés directes, et non sur les propriétés héritées. Vous pouvez par exemple faire delete node.getAttribute sur un Element et tout va bien - vous avez peut-être supprimé une propriété qui cachait la propriété héritée, mais il hérite toujours getAttribute du prototype.

90voto

Tiago Vaccari Points 814

La logique derrière cela est que vous devez implémenter votre interface avec une propriété optionnelle comme celle-ci :

interface Thing {
  prop?: string;
}

function f(x: Thing) {
  delete x.prop; 
}

Donc le contrat de l'interface ne sera pas rompu.

23voto

joeytwiddle Points 3226

Solution rapide

Vous pouvez changer le type de x à un partiel :

function f(x: Partial<Thing>) {
  delete x.prop;
}

Mais je n'aime généralement pas muter (modifier) des objets qui m'ont été transmis par un code peut-être inconnu. J'ai donc tendance à créer un nouvel objet à la place :

function f(x: Thing) {
  const y = { ...x } as Partial<Thing>;
  delete y.prop;
}

Desde Partial rend toutes les propriétés facultatives, ce qui vous permettra de supprimer tout ce qui se trouve dans la section y .

Recommandé

Pour être plus précis, vous pourriez utiliser PartialBy (one liner) ou SetOptional (de type-fest) :

  const y = { ...x } as PartialBy<Thing, 'prop1' | 'prop2'>;

Cela ferait prop1 y prop2 facultatif mais conserve toutes les autres propriétés telles qu'elles étaient à l'origine.

Note

Ci-dessus, j'ai écrit const y = value as Type; parce que je le trouve plus facile à lire. Mais vous devriez probablement utiliser const y: Type = value; à la place, parce que cela fait meilleure vérification des types .

20voto

Edgar Olivar Points 490

Peut-être que cela peut aider

const { propToDelete, ...otherProps} = youObject
return otherProps

avec cela, vous pouvez utiliser l'objet otherProps sans vous casser

9voto

Logan Devine Points 1485

Une autre implémentation si vous voulez qu'elle existe :

interface Thing {
  prop: string;
}
interface PropoptionalThing {
  prop?: string;
}

function f(x: Thing): PropoptionalThing {
  let tmp: PropoptionalThing = x;
  delete tmp.prop;
  return tmp;
}

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