當我寫一個庫的一部分,我希望讓用戶將函數作爲對象的關鍵點:在創建對象時,如何安全地假定使用toString()將非字符串鍵轉換爲字符串?
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 translates any key to string使用toString()
所以它的工作原理,但我的問題是:
是如何安全的呢?
從技術上講,它在ES2015環境中是安全的。但是,您現在依賴隱式類型強制。每個人都在看你的代碼,不能立即告訴對象有什麼屬性名稱。並考慮沒有自定義'toString'的函數:'const id = x => x; o = {[id]:「foo」}' 產生'{x => x:「foo」}'。 – ftor
是的,我知道。如果你看看我們的圖書館,從流程中可以清楚看到。我不只是將自定義的'toString()'作爲對象的鍵來指定一個隨機函數:) –