我知道您可以使用ES2015 Proxy
API动态创建属性:
const someObject = {
foo: 'bar',
some: 'thing',
};
const proxy = new Proxy(someObject, {
get: (target, prop) => {
if (target[prop] === undefined) {
target.prop = `newly added ${prop}`;
return target.prop;
}
return target.prop;
}
});
proxy.one;
console.log(someObject);

我可以在没有无法使用的代理服务器的情况下执行此操作吗?
你的实际问题是什么? - Bergi
我尝试创建一个函数,该函数接受一个选择器函数,该函数从较大的对象中选择一个属性并将其转换为属性的字符串数组:
function getNestedPath<T, S>(selector: (t: T) => S): string[] {
// ...
}
const obj = {
nested: {
a: 'something',
}
};
getNestedPath($ => $.nested.a); // ['nested', 'a']
更多背景:
我使用的是immutable.js,并且有一个setIn
和updateIn
方法接受一个字符串数组,这些字符串是您要设置或更新的嵌套对象的属性。
以下是他们的例子:
const { Map } = require('immutable@4.0.0-rc.9')
const originalMap = Map({
subObject: Map({
subKey: 'subvalue',
subSubObject: Map({
subSubKey: 'subSubValue'
})
})
})
const newMap = originalMap.setIn(['subObject', 'subKey'], 'ha ha!')
// Map {
// "subObject": Map {
// "subKey": "ha ha!",
// "subSubObject": Map { "subSubKey": "subSubValue" }
// }
// }
const newerMap = originalMap.setIn(
['subObject', 'subSubObject', 'subSubKey'],
'ha ha ha!'
)
// Map {
// "subObject": Map {
// "subKey": "subvalue",
// "subSubObject": Map { "subSubKey": "ha ha ha!" }
// }
// }
我想要做的是看看我是否可以将API更改为...
updateIn<S>(selector: ($: this) => S, updater: (s: S | undefined) => S): this;
...主要是因为API可以更好地处理打字稿类型。为此,我想我可以使用Proxy
之类的东西将选择器函数($: T) => S
转换为字符串数组string[]
。
const originalMap = Map({
subObject: Map({
subKey: 'subvalue',
subSubObject: Map({
subSubKey: 'subSubValue'
})
})
})
// how this API would look
originalMap.updateNested(
$ => $.subObject.subSubObject,
subSubObject => subSubObject.set('subSubKey', 'new value')
)