Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

Вы можете использовать тип утверждения, например:

(<any>Object).assign(this.success, success.json())

Ответ 2

Настройка:

Если вы используете код VS (или если вы видите файл tsconfig.json):

Вы должны добавить свойство lib в ваш tsconfig.json и тогда ваш редактор будет использовать определения типов связанного набора текста, а также даст вам intellisense.

Просто добавьте "lib": ["es2015", "es2017", "dom"] в ваш tsconfig.json и перезапустите VS Code

{
    "compilerOptions": {
        // ...
        "target": "es5",
        "lib": ["es2015", "es2017", "dom"]
        // ...
    }
}

Посмотреть все варианты tsconfig.json здесь.

Если вы используете Visual Studio или MSBuild, включите этот тег:

<TypeScriptLib>es2015, es2017, dom</TypeScriptLib>

Смотрите все опции компилятора машинописи MSBuild и их использование здесь.


Проверьте свою работу:

Если вы настроили свой проект на использование встроенных типов и перезапустили ваш редактор, тогда ваш результирующий тип будет выглядеть так, а не тип как any когда вы используете Object.assign:

code example 1


Примечание о полифиллах и совместимости с более старыми браузерами

Обратите внимание, что если вы переходите на ES5 или ниже и ориентируетесь на IE11, вам нужно будет включить полифилы, потому что компилятор машинописного текста не будет включать полифилы для вас.

Если вы хотите включить полифилы (что следует), я бы порекомендовал использовать полифилы core-js.

npm install --save core-js

Затем в точке входа в вашем приложении (например, /src/index.ts) добавьте импорт для core-js вверху файла:

import 'core-js';

Если вы не используете npm вы можете просто вставить следующий полифилл, взятый из 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
  });
}

Ответ 3

Это вызвано тем, что вы используете функцию ECMAScript 6 и настраиваете ECMAScript 5 или 3. Самое простое исправление - установить правильную цель, например, если вы используете Grunt:

options: {
    target: 'es6'
}

изменить соответствующую вкладку свойств в Visual Studio или вручную, отредактировав файл .csproj и найти элемент TypeScriptTarget и перейти на ES6, например:

<TypeScriptTarget>ES6</TypeScriptTarget>

Если вам нужно настроить таргетинг на ES5, просто добавьте следующее в код TypeScript

declare interface ObjectConstructor {
    assign(target: any, ...sources: any[]): any;
}

Это объединяет дополнительный метод, решая проблему. Подробнее здесь. Возможно, вам понадобится polyfill, в зависимости от ваших требований совместимости с браузером - например, этот 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;
    };
  })();
}

Ответ 4

Я добавил типизацию:

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

Ответ 5

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

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

Ответ 6

Вы можете использовать оператор распространения, как в ES6

const obj = {...this.success,...success.json()};

Ответ 7

Я знаю, что это было долго, но здесь легко исправить

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