TypeScript does not allow this because it cannot generate JavaScript code for such a construct. In JavaScript, there is no way to define a catch-all setter / setter in a class that is called whenever any property is set.
The closest I could get is to define methods hasItem, getItemand setItemin the class, and then wrap each instance ES2015 Proxy, get set .
function isArrayIndex(key) {
var keyAsNumber = +key;
if (keyAsNumber < 0) {
return false;
}
if (keyAsNumber !== keyAsNumber|0) {
return false;
}
return true;
}
function toArrayIndex(key) {
return key|0;
}
function MyArrayWrapper(wrapped) {
this.wrapped = wrapped;
}
MyArrayWrapper.prototype = {
get length() {
return this.wrapped.length;
},
clear() {
this.wrapped.length = 0;
},
getItem(index) {
return this.wrapped[index];
},
setItem(index, value) {
this.wrapped[index] = value;
}
}
var MyArrayWrapperProxyHandler = {
get: function (target, key, receiver) {
if (isArrayIndex(key)) {
return receiver.getItem(toArrayIndex(key));
} else {
return Reflect.get(target, key, receiver);
}
},
set: function (target, key, value, receiver) {
if (isArrayIndex(key)) {
return receiver.setItem(toArrayIndex(key), value);
} else {
return Reflect.set(target, key, value, receiver);
}
}
};
MyArrayWrapper.prototype = new Proxy(MyArrayWrapper.prototype, MyArrayWrapperProxyHandler);
var array = ['a', 'b', 'c'];
var wrapper = new MyArrayWrapper(array);
console.log('read:', wrapper[2] === 'c');
wrapper[3] = 'd';
console.log('write:', array[3] === 'd');
console.log('resize:', wrapper.length === 4);
Hide resultProxy, Reflect (, this.wrapped) . , (, '2' in wrapped - false), .
, - , , hasItem/getItem/setItem, - . , foo[0] = 'bar' , .
, , TypeScript getter/setter. " ", , JavaScript.:-P