Using TypeScript, and Object.assign gives me an error "property 'assign' does not exist on type 'ObjectConstructor'"
Object.assign
is an ECMAScript2015 feature and does not exist in ECMAScript5 and lower.
You're most likely targeting to compile your Typescript for ECMAScript5 and therefor the Object interface does not have assign
defined.
You can either target ECMAScript2015 by changing your TS compiler configuration with
target: 'es6'
or you can extend the ObjectConstructor interface with the method assign
declare interface ObjectConstructor {
assign(...objects: Object[]): Object;
}
(you can add this declaration anywhere, redeclaring an interface extends it instead of overwriting it)
Or you can coerce Object
to any
and ignore its typing:
(<any>Object).assign( this.photos, photos )
Whichever you choose, keep in mind that if you want this to run on older browsers you need to add a polyfill. Most modern browsers are fairly close to implementing the ES2015 feature set, but they're not 100% there, meaning that some parts of your code will still fail if you rely on ES2015 functionality.
Typescript will not polyfill Object.assign
when targetting ES5 or older, that is why you are getting this error. On the other hand, Babel does have polyfills in the form of plugins, which would mean you need to incorporate Babel transpilation into your build pipeline, see: https://babeljs.io/docs/plugins/transform-object-assign/
As a final option you can consider using a library as Lodash or jQuery, which have their own implementation of Object.assign
(called extend
)
With Typescript 2.1 or higher, you can use Object spread syntax instead.
let obj = { x: 1, y: "string" };
var newObj = {...obj, z: 3, y: 4}; // { x: number, y: number, z: number }
The order of specifying spread operations determines what properties end up in the resulting object; properties in later spreads “win out” over previously created properties.