Свойство 'assign' не существует в типе 'ObjectConstructor'
Я использую TypeScript в моем приложении, где я использую функцию:
Object.assign(this.success, success.json())
однако, во время компиляции, я получаю следующее сообщение об ошибке:
error TS2339: Property 'assign' does not exist on type 'ObjectConstructor'.
у вас есть какие-либо идеи, как я могу избавиться от этой ошибки?
5 ответов:
можно использовать утверждение типа, например:
(<any>Object).assign(this.success, success.json())
это вызвано использованием функции ECMAScript 6 и таргетингом на ECMAScript 5 или 3. Самое простое исправление-установить правильную цель, например, если вы используете Grunt:
options: { target: 'es6' }изменения соответствующей вкладки свойств в Visual Studio или вручную путем редактирования .файл csproj и поиск элемента TypeScriptTarget и изменение на ES6, например:
<TypeScriptTarget>ES6</TypeScriptTarget>Если вам нужно настроить таргетинг на ES5, просто добавьте в свой текст следующее код
declare interface ObjectConstructor { assign(target: any, ...sources: any[]): any; }что объединяет дополнительный метод в решении вопроса. Более подробная информация здесь. Вам может понадобиться полифилл, хотя, в зависимости от вашего совместимость с браузерами требования - например этот от MDN:
if (typeof Object.assign != 'function') { (function () { Object.assign = function (target) { 'use strict'; if (target === undefined || target === null) { throw new TypeError('Cannot convert undefined or null to object'); } var output = Object(target); for (var index = 1; index < arguments.length; index++) { var source = arguments[index]; if (source !== undefined && source !== null) { for (var nextKey in source) { if (source.hasOwnProperty(nextKey)) { output[nextKey] = source[nextKey]; } } } } return output; }; })(); }
настройки:
если вы используете VS код (или если вы видите
tsconfig.jsonfile):вы должны добавить
libсвойствоtsconfig.jsonи тогда ваш редактор будет использовать в комплекте определения типов typescript, а также дать вам intellisense.просто добавить
"lib": ["es2015", "es2017", "dom"]наtsconfig.jsonи перезапуск против кода{ "compilerOptions": { // ... "target": "es5", "lib": ["es2015", "es2017", "dom"] // ... } }показать все
tsconfig.jsonопции здесь.если вы используете Visual Studio или MSBuild включает в себя этот тег:
<TypeScriptLib>es2015, es2017, dom</TypeScriptLib>см. все параметры компилятора MSBuild typescript и использование здесь.
проверьте свою работу:
если вы настроили свой проект на использование встроенных типов и перезапустили редактор, то ваш результирующий тип будет выглядеть следующим образом вместо типа
anyпри использованииObject.assign:
обратите внимание на полифилл и старше совместимость с браузером:
Примечание что если вы переходите на ES5 или ниже и ориентируетесь на IE11, вам нужно будет включить полифиллы, потому что компилятор typescript не будет включать полифиллы для вас.
если вы хотите включить полифиллы (которые вы должны), то я бы рекомендовал использовать полифиллы core-js.
npm install --save core-jsесли вы используете webpack, то вы можете добавить конкретные полифилл (или все они) в качестве еще одной точки входа. Затем полифиллы будут включены в комплект.
module.exports = { // ... entry: [ 'core-js', // or just `'core-js/fn/object/assign',` './src/main.ts' ], // ... };если вы не используете
npmилиwebpackзатем вы можете просто вставить следующий полифилл взято из MDN в каком-то месте в коде, который выполняется до вашего использованияObject.assign.if (typeof Object.assign != 'function') { // Must be writable: true, enumerable: false, configurable: true Object.defineProperty(Object, "assign", { value: function assign(target, varArgs) { // .length of function is 2 'use strict'; if (target == null) { // TypeError if undefined or null throw new TypeError('Cannot convert undefined or null to object'); } var to = Object(target); for (var index = 1; index < arguments.length; index++) { var nextSource = arguments[index]; if (nextSource != null) { // Skip over if undefined or null for (var nextKey in nextSource) { // Avoid bugs when hasOwnProperty is shadowed if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) { to[nextKey] = nextSource[nextKey]; } } } } return to; }, writable: true, configurable: true }); }

Comments