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:
我添加了types:
typings install dt~es6-shim --global --save