Свойство 'assign' не существует в типе 'ObjectConstructor'



Я использую TypeScript в моем приложении, где я использую функцию:



Object.assign(this.success, success.json())


однако, во время компиляции, я получаю следующее сообщение об ошибке:



 error TS2339: Property 'assign' does not exist on type 'ObjectConstructor'.


у вас есть какие-либо идеи, как я могу избавиться от этой ошибки?

673   5  

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.json file):

вы должны добавить 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:

code example 1


обратите внимание на полифилл и старше совместимость с браузером:

Примечание что если вы переходите на 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
  });
}

почему бы не использовать оператор spread?

return {this.success, ...success.json() || {}};

Я добавил typings:

typings install dt~es6-shim --global --save

Comments

    Ничего не найдено.