Свойство "записи" не существует для типа "ObjectConstructor"

Я работаю над реализацией ng2. Я использую следующий вызов функции для преобразования объекта в массив:

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

Это стандартная функция js. Однако компилятор ts возвращает следующую ошибку:

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

Основываясь на быстром гугле, кажется, что решением может быть изменение свойства цели compilerOptions с es5 на es6. Однако после некоторых предыдущих исследований предыдущего выпуска я подумал, что смог использовать функциональность es6, добавив дополнительное свойство "lib" в мой tsconfig.json ниже:

  "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()?

3 ответа

Решение

Вы совершенно правы, что изменение target это неправильный подход и изменение lib это правильный подход, однако вы указали неверную версию языка. Согласно MDN, Object.entries был официально добавлен в спецификации ES2017.

"lib": ["es2017"]

поэтому вы должны указать вместо *.

Если вы хотите добавить только объявления для методов Object Функция, которая была добавлена ​​в ES2017, позволяет TypeScript указать более детализированное значение

"lib": ["es2017.object"]

Как отметил Александр Берд, по умолчанию неявное значение "lib" опция зависит от значения, указанного для "target" если представить.

Например:

"target": "es2017"

Будет вызывать соответственно префикс "lib.*" быть включенным по умолчанию, если "lib" указано явно.

Обратите внимание, что вы, вероятно, захотите добавить polyfill самой реализации, такой как this, чтобы гарантировать, что это работает в более ранних версиях.

Примечание: в качестве альтернативы вы можете указать любую более позднюю версию

"lib": ["es2018"]

или даже естественно

"lib": ["esnext"]

Этот последний будет включать объявления для самых последних стандартных функций библиотеки, известных на языке TypeScript. Поскольку он представляет собой движущуюся цель, эту опцию следует использовать с осторожностью, так как полизаполнение всей соответствующей среды выполнения по определению является сложной задачей, которая потребует исследования и может включать загрузку различных полизаполнений в зависимости от вашей целевой среды выполнения.

Примечание: несколько комментаторов спросили, почему было бы неправильно менять --target вместо --lib как оба позволят проверять код типа? Причина в том, что --target меняет способ передачи кода. Например, "target": "es2017" Значит это async функции не будут преобразованы для более старых версий. Это неверно, потому что целью было разрешить использование дополнительных библиотек, а не изменять синтаксис вывода, и важно не дополнять синтаксические функции библиотечными функциями.

Я пробовал использовать принятый ответ, но у меня не получилось.

Я использовал этот ответ /questions/28105816/svojstvo-assign-ne-suschestvuet-dlya-tipa-objectconstructor/28105824#28105824, он работает для меня.

Поделитесь, для кого то же самое с моей ситуацией

const changedFields = (<any>Object).entries(this.ngForm.form.controls)
                                   .filter(value => value[1].dirty);

перейдите в «tsconfig.json» и добавьте:

      "lib": ["es2019"];
Другие вопросы по тегам