function createElement (type, { attrs = {}, children = [] }) {
if (Object.prototype.toString.call(arguments[1]) !== '[object Object]') {
throw Error('The options argument must be an object');
}
return {
type,
attrs,
children
}
}
У меня есть функция, которая принимает два аргумента: строку и объект. В объявлении функции я распаковываю значения объекта путем деструктуризации.
Когда нужно убедиться, что второй аргумент является объектом, я знаю, что могу сделать эту проверку: Object.prototype.toString.call(arguments[1] !== 'object Object')
.
Но если в качестве аргументов передаются null
или undefined
, возникает эта ошибка: Uncaught TypeError: Cannot destructure property 'attrs' of 'undefined' or 'null'.
. Это понятно, потому что null
и undefined
нельзя привести к объектам. Что я могу сделать, чтобы защититься от этого?
Если в качестве второго аргумента передаются array
, number
и т. Д., Ошибка не выдается, поскольку они могут быть принудительно обработаны, и я могу затем обработать эти значения в теле функции. При работе с null
или undefined
код в функции никогда не выполняется.
// expected behaviour
createElement('div', []); // Uncaught Error: The options argument must be an object
createElement('div', function(){}); // Uncaught Error: The options argument must be an object
createElement('div', false); // Uncaught Error: The options argument must be an object
createElement('div', new Date()); // Uncaught Error: The options argument must be an object
createElement('div', 4); // Uncaught Error: The options argument must be an object
// unwanted behaviour
createElement('div', null); // Uncaught TypeError: Cannot destructure property `attrs` of 'undefined' or 'null'
createElement('div', undefined); // Uncaught TypeError: Cannot destructure property `attrs` of 'undefined' or 'null'
Отредактировано, чтобы обеспечить окончательное решение : После прочтения комментариев, кажется, что единственное решение - это разрешить выбрасывание исключения или деструктурировать код в теле функции и обработать ошибку. Это решение, которое я выбрал:
createElement (type, opts) {
if (arguments[1] !== undefined && Object.prototype.toString.call(opts) !== '[object Object]') {
throw Error('The options argument must be an object');
}
const { attrs = {}, children = [] } = opts || {};
return {
type,
attrs,
children
}
}