“ObjectConstructor”类型中不存在属性“assign”

时间:2016-03-12 15:11:32

标签: typescript

我在我的应用程序中使用TypeScript,我在其中使用函数:

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

但是,在编译期间,我收到以下错误:

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

你知道我怎么能摆脱这个错误?

8 个答案:

答案 0 :(得分:136)

配置:

如果您正在使用VS代码(或者如果您看到tsconfig.json文件):

您应该将lib属性添加到tsconfig.json,然后您的编辑器将使用捆绑的打字稿类型定义,并为您提供智能感知。

只需将"lib": ["es2015", "es2017", "dom"]添加到tsconfig.json并重新启动VS代码

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

查看所有tsconfig.json个选项here

如果您使用Visual Studio或MSBuild包含此标记:

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

查看所有MSBuild typescript编译器选项和用法here

检查你的工作:

如果您已将项目配置为使用内置类型并重新启动编辑器,那么当您使用any时,结果类型将显示为此类型,而不是Object.assign类型:

code example 1

关于polyfill和旧浏览器兼容性的注意事项:

  

注意如果您要转换为ES5或更低版本并且目标是IE11,则需要包含polyfill,因为typescript编译器不会包含polyfill。

如果您想要包含polyfills(您应该),那么我建议使用core-js的polyfills。

npm install --save core-js

然后在您应用的入口点(例如/src/index.ts),在文件顶部添加core-js的导入:

import 'core-js';

如果您未使用npm,则可以将以下填充taken from 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
  });
}

答案 1 :(得分:119)

这是由于您使用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;
}

合并额外的方法,解决问题。更多细节here。您可能需要填充填充,具体取决于您的browser compatibility要求 - 例如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;
    };
  })();
}

答案 2 :(得分:118)

您可以使用type assertion,如下所示:

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

答案 3 :(得分:2)

为什么不使用点差运算符?

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

答案 4 :(得分:1)

我添加了打字:

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

答案 5 :(得分:1)

您可以像ES6一样使用传播算子

Manifest-Version: 1.0 Created-By: 1.8.0_222 (Private Build) Main-Class: com.ydsoftware.taskcalender.EntryPoint Class-Path: lib/MX%20Engine.jar / blank / / blank /

答案 6 :(得分:0)

我知道已经很久了,但这是一个简单的解决方法

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

答案 7 :(得分:0)

在使用@testing-library/react和Jest测试React应用程序时,我遇到了这个问题。对我来说,解决方法是将以下内容添加到我的setupTests.ts中:

declare global {
    interface Object {
        /**
         * Returns an array of values of the enumerable properties of an object
         * @param o Object that contains the properties and methods. This can be an object that you created or an existing Document Object Model (DOM) object.
         */
        values<T>(o: { [s: string]: T } | ArrayLike<T>): T[];

        /**
         * Returns an array of values of the enumerable properties of an object
         * @param o Object that contains the properties and methods. This can be an object that you created or an existing Document Object Model (DOM) object.
         */
        values(o: {}): any[];

        /**
         * Returns an array of key/values of the enumerable properties of an object
         * @param o Object that contains the properties and methods. This can be an object that you created or an existing Document Object Model (DOM) object.
         */
        entries<T>(o: { [s: string]: T } | ArrayLike<T>): [string, T][];

        /**
         * Returns an array of key/values of the enumerable properties of an object
         * @param o Object that contains the properties and methods. This can be an object that you created or an existing Document Object Model (DOM) object.
         */
        entries(o: {}): [string, any][];
    }
}