作为我编写的库的一部分,我想让用户将函数作为对象的键传递:
https://github.com/welldone-software/redux-toolbelt/tree/master/packages/redux-toolbelt#makereducer
例如,在下文中,increaseBy
是一个具有自定义toString()
的函数,该函数返回一个字符串,decreaseBy.TYPE
是一个字符串。
const reducer = makeReducer({
[increaseBy]: (state, {payload}) => state + payload,
[decreaseBy.TYPE]: (state, {payload}) => state - payload,
}, { defaultState: 100 })
其中increaseBy
是一个函数,该函数具有解析为字符串的自定义toString()
。
JS使用toString()
将任何键转换为字符串,因此它可以工作,但我的问题是:
它有多安全?
根据 ES6 规范,在第四步中"ComputedPropertyName"的"12.2.6.8 运行时语义:评估"部分下,我们有:
- 返回 ToPropertyKey(propName)。
在第四步的"7.1.14 ToPropertyKey(参数)"下:
- 返回字符串(键)。
所以[expression]
的结果会变得toString
.另一方面,任何字符串都是属性的有效键,尽管其中一些只能通过括号访问。