Vyhledávání na webu

typescript - Vlastnost 'assign' neexistuje na typu 'ObjectConstructor'


Ve své aplikaci používám TypeScript, kde používám funkci:

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

Nicméně během kompilace dostávám následující chybu:

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

Máš tušení, jak se této chyby zbavit?

Odpověď č. 1

Konfigurovat:

Pokud používáte VS Code (nebo pokud vidíte soubor tsconfig.json):

Měli byste přidat vlastnost lib do vašeho tsconfig.json a poté bude váš editor používat přiložené definice typů TypeScriptu a také vám poskytne IntelliSense.

Stačí přidat "lib": ["esnext", "dom"] do vašeho tsconfig.json a restartovat VS Code

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

Všechny možnosti tsconfig.json najdete zde.

Pokud používáte Visual Studio nebo MSBuild, zahrňte tento tag:

<TypeScriptLib>esnext, dom</TypeScriptLib>

Zde si prohlédněte všechny možnosti a použití kompilátoru TypeScript v MSBuild.

Zkontrolujte svou práci:

Pokud jste nakonfigurovali svůj projekt tak, aby používal vestavěné typy, a restartovali jste svůj editor, výsledný typ bude vypadat takto místo toho, aby byl typ any při použití Object.assign:

Poznámka o polyfillech a kompatibilitě se staršími prohlížeči:

Poznámka, že pokud transpiluji do ES5 nebo nižší a cílím na IE11, bude potřeba zahrnout polyfily, protože překladač TypeScriptu je nezahrne za vás.

Pokud byste chtěli zahrnout polyfily (což byste měli), doporučil bych použít polyfily z core-js.

npm install --save core-js

nebo

yarn add core-js

Poté v vstupním bodě vaší aplikace (např. /src/index.ts) přidejte import pro core-js na začátek souboru:

import 'core-js';

Pokud nepoužíváte správce balíčků, můžete jednoduše vložit následující polyfill převzatý z MDN na nějaké místo ve vašem kódu, které se spustí před vaším použitím 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
  });
}

Odpověď č. 2

Můžete použít přetypování, takto:

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

Odpověď č. 3

To je způsobeno tím, že používáte funkci ECMAScript 6 a cílíte na ECMAScript 5 nebo 3. Nejsnazší oprava je nastavit správný cíl, například pokud používáte Grunt:

options: {
    target: 'es6'
}

změnit příslušnou vlastnost na kartě v Visual Studiu, nebo ručně upravením souboru .csproj a nalezením elementu TypeScriptTarget a jeho změnou na ES6, například:

<TypeScriptTarget>ES6</TypeScriptTarget>

Pokud potřebujete cílit na ES5, pak jednoduše přidejte následující do svého kódu TypeScript

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

To sloučí další metodu, čímž se problém vyřeší. Více informací zde. Mohli byste ale potřebovat polyfill, v závislosti na požadavcích kompatibility vašeho prohlížeče - například tento od 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;
    };
  })();
}

Související články