Property'assign'在types'ObjectConstructor'上不存在

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

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

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

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

你有什么想法,我怎么能摆脱这个错误?

你可以使用types断言 ,如下所示:

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

这是由于您使用ECMAScript 6function并定位ECMAScript 5或3所致。最简单的修复方法是设置正确的目标,例如,如果您使用的是Grunt:

 options: { target: 'es6' } 

在Visual Studio中更改相关属性选项卡,或手动编辑.csproj文件并findTypeScriptTarget元素并更改为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; }; })(); } 

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

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

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

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

在这里查看所有tsconfig.json选项。


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

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

在这里查看所有的MSBuild打字稿编译选项和用法。


关于polyfills的注意事项:

请注意 ,如果您正在转换为ES5或更低版本,那么打字稿编译器将不会包含您的polyfills。

如果你想包括polyfills(你应该),那么我会build议使用core-js的polyfills。

npm install --save core-js

如果您使用的是webpack,那么您可以添加特定的polyfill(或所有这些)作为另一个入口点。 然后polyfills将包括在捆绑。

 module.exports = { // ... entry: [ 'core-js', // or just `'core-js/fn/object/assign',` './src/main.ts' ], // ... }; 

如果你不使用npm或者webpack那么你可以在你的代码的某个地方粘贴下面的从MDN中获得的 webpack ,在你使用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 }); } 

如果您已经将项目configuration为使用内置types(使用此处描述的方法),那么您的结果types将如下所示,而不是types:

代码示例1


我添加了types:

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