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;
};
})();
}
