Argument with default value is not enumerable
Hi!
We are using "@ember-decorators/argument": "0.8.21", and noticed that if we have a default value for an argument annotated with @argument keyword, that property becomes non-enumerable.
We need all own properties to be enumerable to support converting ember object to simple javascript object for storing in localstorage. For this we do Object.keys on an ember object and recursively serialize object to a plain JS object.
So if we do:
/**
* @type {number}
*/
@argument('number')
amount = 0;
we see that this property is not part of Object.keys. If we log this object in chrome console this property is greyed out. If we simply remove default value like this:
/**
* @type {number}
*/
@argument('number')
amount;
all starts to work fine.
Same with optional value, this code also leads to property not being enumerable:
/**
* @type {number}
*/
@argument(optional('number'))
amount = 0;
Unfortunately any decorated property that assigns a getter/setter to the property will not be enumerable. This is also going to be an issue with @tracked in Ember in general, and is an issue for computed properties 😕 I'm not sure what a great solution would be here that would also be performant. This may be something to discuss with decorators in general.
Well, the point is:
- it is enumerable until it has default value is set... Meaning it can have
@argumentannotation and still be enumerable. - I can enumerate properties that use other annotations as well:
@computedor@alias. Did not try it with@tracked
I wonder what does Chrome console use to display such object - as I already said they display this property greyed out.
It shouldn't be possible to enumerate properties with @computed, unless you're enumerating on the prototype? I'm not sure how that would work. Here's a twiddle that demonstrates that, it isn't enumerating the properties: https://ember-twiddle.com/b2f668d0ed862eb1490e155120853f15?fileTreeShown=false