我在我的应用程序中使用TypeScript,我在其中使用函数:
Object.assign(this.success, success.json())
但是,在编译期间,我收到以下错误:
error TS2339: Property 'assign' does not exist on type 'ObjectConstructor'.
你知道我怎么能摆脱这个错误?
答案 0 :(得分:136)
tsconfig.json
文件):您应该将lib
属性添加到tsconfig.json
,然后您的编辑器将使用捆绑的打字稿类型定义,并为您提供智能感知。
只需将"lib": ["es2015", "es2017", "dom"]
添加到tsconfig.json
并重新启动VS代码
{
"compilerOptions": {
// ...
"target": "es5",
"lib": ["es2015", "es2017", "dom"]
// ...
}
}
查看所有tsconfig.json
个选项here。
<TypeScriptLib>es2015, es2017, dom</TypeScriptLib>
查看所有MSBuild typescript编译器选项和用法here。
如果您已将项目配置为使用内置类型并重新启动编辑器,那么当您使用any
时,结果类型将显示为此类型,而不是Object.assign
类型:
注意如果您要转换为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][];
}
}