Проверка типов параметров функции в JavaScript
Как известно - JavaScript - это язык с динамической типизацией. В этом его плюсы и минусы.
Но при описании какой-либо функции часто бывает необходимо проверить параметры на соответствие ожидаемым типам. Так, например, если мы ждем, что в функцию должен прийти объект, а приходит число - то мы получим ошибку, так как у числа, скорее всего не будет того метода объекта, который мы ожидаем.
Для решения задач проверки типов (в том числе), придумано множеств библиотек (flow от Facebook, например) и даже языков (TypeScript, например), но я покажу Вам в данной статье, конечно далекую от идеала, но, тем не менее, решающую базовые задачи по проверке типов функций.
Итак, далее код:
// получает строковое название типа переданного объекта, (number, string, object)
function typeOf( obj ) {
// вызываем метод toString и получаем строку, для числа например, [object Number]
// далее с помощью регулярных выражений вытаскиваем название типа и приводим его нижнему регистру
return Object.prototype.toString.call( obj ).match(/\s(\w+)/)[1].toLowerCase();
}
/**
* функция проверяющая типы переданных аргументов
*
*
* @param args {Object} - массивоподобный объект всех аргументов из проверяемой функции
* @param types {Array} - массив типов
**/
function checkTypes( args, types )
{
// превращаем массивоподобный объект в обычный массив
const _args = Array.prototype.slice.call( args );
// проходим по массиву переданных типов сравнивая их с фактически переданными в функцию типами
for ( let i = 0; i < types.length; ++i )
{
// если типы не совпадают - бросаем исключение
if ( typeOf( _args[i] ) !== types[i] ) {
throw new TypeError( 'Параметр '+ i +' должен иметь тип '+ types[i] );
}
}
}
Далее посмотрим на пример:
function doSomeWork(times, callback)
{
// передаем встроенный объект arguments, содержащий все аргуметы функции
// и массив типов ожидаемых параметров
checkTypes(arguments, ['number', 'function']);
// проверка прошла вызываем функцию
callback(times);
}
// правильные параметры
doSomeWork(10, (times) => {
console.log(times)
})
// Uncaught TypeError: Параметр 0 должен иметь тип number
doSomeWork([], (times) => {
console.log(times)
})
Вот таким образом мы можем проверить типы входных параметров функции в JavaScript.
-
- Михаил Русаков
Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.