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

新手上路,请多包涵

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

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

原文由 user1354934 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

Object.assign 是 ECMAScript2015 特性,在 ECMAScript5 及更低版本中不存在。

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

您可以通过更改 TS 编译器配置来定位 ECMAScript2015

target: 'es6'

或者您可以使用方法扩展 ObjectConstructor 接口 assign

 declare interface ObjectConstructor {
    assign(...objects: Object[]): Object;
}

(你可以在任何地方添加这个声明,重新声明一个接口扩展它而不是覆盖它)

或者你可以强制 Objectany 并忽略它的类型:

(<any>Object).assign( this.photos, photos )

无论您选择哪个,请记住,如果您希望它在旧浏览器上运行,您需要添加一个 polyfill。大多数现代浏览器都相当接近于实现 ES2015 功能集,但它们并不是 100% 实现了,这意味着如果您依赖 ES2015 功能,您的代码的某些部分仍然会失败。

Typescript 不会 Object.assign ES5 或更早版本为目标时,这就是您收到此错误的原因。另一方面,Babel 确实有插件形式的 polyfill,这意味着您需要将 Babel 转译合并到您的构建管道中,请参阅: https ://babeljs.io/docs/plugins/transform-object-assign/

作为最后的选择,您可以考虑使用 Lodash 或 jQuery 这样的库,它们有自己的 Object.assign 实现(称为 extend

原文由 vileRaisin 发布,翻译遵循 CC BY-SA 3.0 许可协议

使用 Typescript 2.1 或更高版本,您可以改用对象扩展语法。

 let obj = { x: 1, y: "string" };
var newObj = {...obj, z: 3, y: 4}; // { x: number, y: number, z: number }

指定展开操作的顺序决定了结果对象中的最终属性;后来传播的属性“胜过”先前创建的属性。

原文由 paibamboo 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题