web-dev-qa-db-ja.com

プロパティ 'entries'はタイプ 'ObjectConstructor'に存在しません

私はng2の実装に取り​​組んでいます。次の関数呼び出しを使用して、オブジェクトを配列に変換しています。

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

これは標準のjs関数です。ただし、tsコンパイラは次のエラーを返します。

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

クイックグーグルに基づいて、その解決策は、compilerOptionsターゲットプロパティをes5からes6に変更することであると思われます。ただし、以前の問題に関するいくつかの以前の調査の後、以下のtsconfig.jsonに追加の「lib」プロパティを含めることで、es6の機能を活用できると考えました。

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

ターゲットプロパティをes2015に変更してからプロジェクトを再構築し、「typescriptUsingTsConfig」を実行しましたが、同じエラーが発生します。 Object.entries()関数を活用するためにここで何ができるか考えていますか?

37
user8334943

targetを変更することは間違ったアプローチであり、libを変更することは正しいアプローチであることは非常に正しいですが、間違ったバージョンの言語を指定しました。 MDNによるObject.entriesはES2017仕様に正式に追加されました。

"lib": ["es2017"]

したがって、代わりに指定する必要があります*。

追加 ES2017であったObject関数のメソッドの宣言onlyを追加する場合、TypeScriptでは a more粒度値

"lib": ["es2017.object"]

Alexander Birdが述べたように、デフォルトでは、"lib"オプションの暗黙的な値は、"target"に指定された値に依存します(存在する場合)。

例えば:

"target": "es2017"

"lib.*"が明示的に指定されていない限り、対応する接頭辞付きの"lib"がデフォルトで含まれます。

実装自体のポリフィル this oneなど を追加して、これが古いランタイムで機能することを確認することに注意してください。

注:代替として、より新しいバージョンを指定できます

"lib": ["es2018"]

または自然に

"lib": ["esnext"]

この最後には、TypeScript言語で認識されている最新の標準ライブラリ機能の宣言が含まれます。移動するターゲットを表すため、このオプションは注意して使用する必要があります。対応するランタイムのすべてをポリフィルすることは、研究が必要であり、ターゲットランタイムに応じて異なるポリフィルをロードする複雑なタスクであるためです。

注:数人のコメンターが、コードを有効にするために--targetの代わりに--libを変更することが間違っている理由を尋ねましたタイプチェック?その理由は、--targetがコードの変換方法を変更するためです。たとえば、"target": "es2017"は、async関数が古いランタイム用に変換されないことを意味します。これは、出力構文を変更するのではなく、追加のライブラリの使用を有効にすることを目的としているため、構文機能とライブラリ機能を区別することが重要であるため、間違っています。

68
Aluan Haddad