我正在再次提出我的问题,因为早些时候我没有意义,而且我不是很清楚。
我从API接收的数据看起来像这样:
{"photos":[{"id":1,"title":"photo_1_title"}]}
因此,在我的代码中,我有一个photos
变量,以及一个名为getPhotos()
的方法
我正在使用无限滚动,所以当我到达页面底部时,我再次致电getPhotos()
。
photos: any;
getPhotos() {
this.photoService.getPhotos()
.subscribe(
photos => this.photos = photos
// here, instead of doing this, I want to add the array of photos I get back to this.photos using Object.assign however it is giving me the said error
)
}
因此,如果下次我调用它,我会回来{"photos":[{"id":2,"title":"photo_2_title"}]}
,然后我会尝试将this.photos
设置为
{"photos":[{"id":1,"title":"photo_1_title"}, {"id":2,"title":"photo_2_title"}]}
有人可以帮助我解决原因吗 jsfiddle.net/ca46hLw9不起作用?我认为assign应该合并一个对象的内容吗?
答案 0 :(得分:58)
Object.assign
是一个ECMAScript2015功能,在ECMAScript5及更低版本中不存在。
您最有可能的目标是为ECMAScript5编译您的Typescript,因此Object接口没有定义assign
。
您可以通过使用
更改TS编译器配置来定位ECMAScript2015 target: 'es6'
或者您可以使用方法assign
declare interface ObjectConstructor {
assign(...objects: Object[]): Object;
}
(你可以在任何地方添加这个声明,重新声明一个接口扩展它而不是覆盖它)
或者您可以Object
强制any
并忽略其输入:
(<any>Object).assign( this.photos, photos )
无论您选择哪种方式,请记住,如果您希望在旧版浏览器上运行此功能,则需要添加polyfill。大多数现代浏览器都非常接近实现ES2015功能集,但它们并非100%存在,这意味着如果您依赖ES2015功能,代码的某些部分仍然会失败。
在目标ES5或更早版本时,Typescript不会填充Object.assign
,这就是您收到此错误的原因。另一方面,Babel确实有插件形式的polyfill,这意味着你需要将Babel转换结合到你的构建管道中,参见:https://babeljs.io/docs/plugins/transform-object-assign/
作为最终选项,您可以考虑将库用作Lodash或jQuery,它们具有自己的Object.assign
实现(称为extend
)
答案 1 :(得分:50)
使用Typescript 2.1或更高版本,您可以改为使用对象扩展语法。
let obj = { x: 1, y: "string" };
var newObj = {...obj, z: 3, y: 4}; // { x: number, y: number, z: number }
指定展开操作的顺序决定了哪些属性 最终产生的对象;后期点差中的属性“赢出” 以前创建的属性。
答案 2 :(得分:0)
对于2.0版或更高版本的打字稿,只需修改tsconfig.json文件,以便“ lib”部分包含“ es6”:
"lib": [
"es5",
"es6",
"dom",
"es2015.collection"
]