Деструктуризация аргумента функции

При деструктуризации аргумента иногда указывают дефолтное значение, это позволяет:

  • гибко задать значения параметров по умолчанию, например, из заранее подготовленного объекта
  • избежать Uncaught TypeError при вызове функции без аргументов

Преимущества функций с деструктурированным аргументом:

  • понятные аргументы
  • оператор spread
  • композиция

Разберем это подробнее на примерах.

Понятные аргументы

Явные аргументы за счет ключей. Можно пропускать дефолтные значения:

function findUsersByRole({
role,
withContactInfo = true,
includeInactive
} = {}
) {
// do something
}

findUsersByRole({ role: 'Admin', includeInactive: true })

Оператор spread

Можно собрать аргументы в новый объект с помощью spread синтаксиса:

const saveUser = ({  transaction,  ...userInfo }) => {
console.log(userInfo)
}

saveUser({ transaction: 'INSERT', name: 'Ivan', email: 'some@email.com' })
// выведет {name: 'Ivan', email: 'some@email.com'}

Композиция

Использование объекта позволяет реализовать композицию функций:

function prepareUserInfo(userInfo) {
return pipe(validate, normalize, persist)(userInfo);
}

function pipe(...fns) {
return param => fns.reduce((result, fn) => fn(result), param);
}

function validate({
id,
firstName,
lastName,
email = requiredParam(),
username = requiredParam(),
pass = requiredParam(),
address,
...rest}

) {
// do some validation return {
// id, firstName, lastName, email, username, pass, address, ...rest
// }
}

function normalize({ email, username, ...rest }) {
// do some normalizing return { email, username, ...rest }
}

async function persist({ upsert = true, ...info }) {
// save userInfo to the DB return { operation, status, saved: info }
}

function requiredParam(param) {
throw Error(`Required parameter, "${param}" is missing.`);
}
Редактировать на GitHub