Как известно - JavaScript - это язык с динамической типизацией. В этом его плюсы и минусы.

Проверка типов параметров функции в 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.