2017-08-18 26 views
0

我正在使用immutable.js,有时我传递字符串id,有时我将数字id传递给了我的不可变对象。有没有办法强制immutable.js使用字符串ID?

其结果是,一个Immutable.Map可以有两个相同的孩子,像这样:

Map({ 
    1: foo, 
    '1': bar, 
}); 

这是一件好事我真的 - - 想

不幸的是,不可变的对于id类型不够严格,并且导致我很头疼。

有没有办法强制immutable.js在save'em之前将所有数字ID转换为字符串?

谢谢。

+0

也许你可以创建一个代理(HTTPS ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy),并检查已存在的密钥(手动检查每种可能类型的密钥) ' – Seblor

+0

'有时候我传递了字符串id,有时我将数字id传递给了我的不可变'为什么?一个字符串不是一个数字。 '不幸的是,不可变的id编码类型不够严格。它精确地映射你给它的键。查看本地的'Map'类。它的行为方式相同。 – Thomas

回答

0

您可以创建一个代理(MDN Documentation link),将检查已经存在的钥匙(任何类型)在对象上的set访问,就像这样:

var handler = { 
    set: function(obj, prop, value) { 
     if (obj[String(prop)] == undefined && obj[Number(prop)] == undefined) { 
      obj[String(prop)] = value 
     } 
     else { 
      throw new Error("Already exists") 
     } 
    } 
}; 

var p = new Proxy({}, handler); 

p[1] = "test" // p: { 1: "test" } 
p["2"] = "foo" // p: { 1: "test", 2: "foo" } 
p["1"] = "bar" // Throws an "Already exists" error 
相关问题