使用TypeScript和Object.assign给我一个错误“属性'赋值'在类型'ObjectConstructor'上不存在”

时间:2016-08-09 20:48:33

标签: javascript typescript

我正在再次提出我的问题,因为早些时候我没有意义,而且我不是很清楚。

我从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应该合并一个对象的内容吗?

3 个答案:

答案 0 :(得分:58)

Object.assign是一个ECMAScript2015功能,在ECMAScript5及更低版本中不存在。

您最有可能的目标是为ECMAScript5编译您的Typescript,因此Object接口没有定义assign

您可以通过使用

更改TS编译器配置来定位ECMAScript2015

target: 'es6'

或者您可以使用方法assign

扩展ObjectConstructor接口
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"
]