I feel like the answer to this is a hard no in most languages I’ve used other than PHP, which at least used to have some odd corner cases with stuff like $someArray['nonexistentKey']++
.
I’m basically looking to write a sparse object where each property is a numeric counter. The counters should return 0 if undefined and should automatically define themselves with a value of 0 if you try to increment them.
In other words, I want to override the generic Object getter to return 0
in all cases where it would return undefined
… or perhaps define the property right there during the get
and set it to 0
.
So in theory, an overload for ANY property not yet defined would get
initialize it at zero. For example this:
myObj['hugePrimeNumberToBaseXToString']++;
would then make it 1.
In the olden days I feel like some way with Object.__proto__
might have worked for this case…
Advertisement
Answer
I think what you want is a Proxy
.
You can use a proxy to intercept property gets and return your own logic. In this case, return zero in the case of an undefined
property.
// Hold the data const target: { [key in string]: number } = {} // Access the data const proxy = new Proxy(target, { get(target, prop, receiver) { if (typeof prop === 'string') { if (target[prop] === undefined) return 0 return target[prop] } return undefined } }) proxy['hugePrimeNumberToBaseXToString']++ console.log(proxy['hugePrimeNumberToBaseXToString']) //=> 1