Свойство "записи" не существует для типа "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);