Обычно, если вы вызываете toString()
для функции, она возвращает буквальный исходный текст, который использовался для определения функции:
function myFunction() {
const a = 42;
console.log(a);
}
myFunction.toString()
"function myFunction() {
const a = 42;
console.log(a);
}"
Однако в этом случае мы хотим, чтобы someActionCreator.toString()
вернуть тип действия, которое будет частью создаваемых им объектов действия:
const addTodo = createAction("todos/addTodo");
console.log(addTodo("Buy milk"));
// {type: "todos/addTodo", payload: "Buy milk"}
console.log(addTodo.toString());
// "todos/addTodo"
Чтобы это произошло, createAction
переопределяет фактическую реализацию toString
для этих создателей действия :
export function createAction(type: string): any {
function actionCreator(...args: any[]) {
return { type, payload: args[0] }
}
actionCreator.toString = () => `${type}`
actionCreator.type = type
return actionCreator;
}
Это особенно полезно, поскольку вычисляемые литеральные свойства объекта ES6 автоматически пытаются привести в соответствие любые переданные вами значения. Итак, теперь вы можете использовать функцию создателя действия в качестве ключа в объекте, и он будет преобразован в строку типа:
const reducersObject = {
[addTodo]: (state, action) => state.push(action.payload)
}
console.log(reducersObject);
// { "todos/addTodo": Function}