web-dev-qa-db-fra.com

La propriété 'entrées' n'existe pas sur le type 'ObjectConstructor'

Je travaille sur une implémentation ng2. J'utilise l'appel de fonction suivant pour convertir un objet en tableau:

var authors = Object.entries(responseObject.Authors);

Ceci est une fonction standard de js. Cependant, le compilateur ts renvoie l'erreur suivante:

"Property 'entries' does not exist on type 'ObjectConstructor'"

D'après un rapide Google, il semble que la solution pourrait consister à changer la propriété cible compilerOptions d'es5 à es6. Cependant, après des recherches antérieures pour un numéro précédent, je pensais pouvoir tirer parti de la fonctionnalité es6 en incluant la propriété "lib" supplémentaire dans mon fichier tsconfig.json ci-dessous:

  "compilerOptions": {
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "module": "commonjs",
    "noEmitOnError": true,
    "noImplicitAny": false,
    "outDir": "../Scripts/",
    "removeComments": false,
    "sourceMap": true,
    "target": "es5",
    "moduleResolution": "node",
    "lib": [
      "es2015",
      "dom"
    ]
  }

J'ai également essayé de changer la propriété cible en es2015, puis de reconstruire le projet et d'exécuter "typescriptUsingTsConfig" mais j'obtiens toujours la même erreur. Avez-vous une idée de ce que je peux faire ici pour tirer parti de la fonction Object.entries ()?

37
user8334943

Vous avez tout à fait raison de dire que changer target est une mauvaise approche et que changer lib constitue une approche correcte, mais vous avez spécifié une mauvaise version du langage. Selon MDN , Object.entries A été officiellement ajouté à la spécification ES2017.

"lib": ["es2017"]

est donc ce que vous devez spécifier à la place *.

Si vous souhaitez ajouter seulement les déclarations des méthodes de la fonction Object qui étaient ajoutées dans ES2017, TypeScript vous permet de spécifier - ne valeur plus granulaire .

"lib": ["es2017.object"]

Comme l'a noté Alexander Bird, par défaut, la valeur implicite de l'option "lib" Dépend de la valeur spécifiée pour "target" Si elle est présente.

Par exemple:

"target": "es2017"

Le préfixe correspondant "lib.*" Sera inclus par défaut, à moins que "lib" Ne soit spécifié explicitement.

Notez que vous souhaiterez probablement ajouter un polyfill de l’implémentation elle-même, comme celle-ci , afin de s’assurer que cela fonctionne dans les exécutions plus anciennes.

Remarque: vous pouvez également spécifier une version ultérieure.

"lib": ["es2018"]

ou naturellement même

"lib": ["esnext"]

Ce dernier inclura les déclarations des toutes dernières fonctionnalités de bibliothèque standard connues du langage TypeScript. Comme il s’agit d’une cible mouvante, cette option doit être utilisée avec précaution, car le remplissage de l’ensemble du moteur d’exécution correspondant est par définition une tâche complexe qui nécessitera des recherches et peut nécessiter le chargement de plusieurs remplissages multiples en fonction du temps d’exécution de votre cible.

Remarque: , quelques commentateurs ont demandé pourquoi il serait erroné de modifier --target Au lieu de --lib Car les deux activeraient le code à taper chèque? La raison en est que --target Change la façon dont le code est transpilé. Par exemple, "target": "es2017" Signifie que les fonctions async ne seront pas transformées pour les environnements d'exécution plus anciens. Il est incorrect car l'objectif était de permettre l'utilisation de bibliothèques supplémentaires et non de modifier la syntaxe de sortie. Il est donc important de faire la distinction entre les fonctionnalités syntaxiques et les fonctionnalités de bibliothèque.

68
Aluan Haddad