在不使用“Proxy”的情况下动态创建对象的属性

时间:2018-03-08 20:34:10

标签: javascript typescript immutable.js

我知道您可以使用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,并且有一个setInupdateIn方法接受一个字符串数组,这些字符串是您要设置或更新的嵌套对象的属性。

以下是他们的例子:

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')
)

Here is a playground with the concept。见第77行

0 个答案:

没有答案