1. ホーム
  2. javascript

[解決済み] プロパティ 'entries' はタイプ 'ObjectConstructor' に存在しません。

2023-04-20 20:14:29

質問

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

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

これは標準的なjsの関数です。しかし、tsコンパイラは以下のエラーを返します。

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

軽くググってみたところ、compilerOptions の target プロパティを 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() 関数を活用するためにここで何ができるのか、何か見当がつきますか?

どのように解決するのですか?

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

"lib": ["es2017"]

は、その代わりに指定しなければならないものです*。

を追加したい場合は だけ のメソッドに対する宣言を追加したい場合 Object であった関数の で追加された ES2017 では、TypeScript で指定した をより細かい値で指定できるようになりました。 .

"lib": ["es2017.object"]

Alexander Bird が指摘したように、デフォルトでは、暗黙の値として "lib" オプションに指定された値に依存します。 "target" に指定された値に依存します。

例えば

"target": "es2017"

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

なお、この実装自体のポリフィルを追加したい場合が多いでしょう。 このような を追加して、古いランタイムでも動作するようにしたいものです。

注意してください。 を指定すると、それ以降のバージョンを指定することができます。

"lib": ["es2020"]

あるいは、当然ながら

"lib": ["esnext"] 

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

さらに、配列の性質を持つ "lib" オプションの配列の性質により、複数の値を組み合わせてランタイムに適合させることができます。例えば、ポリフィルで提供されるこれらのオブジェクトメソッドを追加して es2015 対応のウェブブラウザに合わせるには、次のように記述します。

"lib": ["es2015", "es2017.object", "dom"]

を参照してください。 TypeScriptハンドブック を参照してください。

注意 を変更することがなぜいけないのかという質問がありました。 --target の代わりに --lib というのは、どちらもタイプチェックができるようになるからですか?その理由は --target はコードがどのようにトランスパイルされるかを変更するからです。例えば "target": "es2017" は、次のことを意味します。 async 関数は古いランタイムでは変換されません。出力構文を変更するのではなく、追加のライブラリの使用を可能にすることが意図されているため、構文上の特徴とライブラリの特徴を区別することが重要であるため、これは不正確な表現です。