src/is/isFunction.ts
const symToStringTag = Symbol.toStringTag
const asyncTag = '[object AsyncFunction]',
funcTag = '[object Function]',
genTag = '[object GeneratorFunction]',
nullTag = '[object Null]',
proxyTag = '[object Proxy]',
undefinedTag = '[object Undefined]'
/**
* This function evaluates whether all parameters are function
*/
export function isFunctions(...parameters: any[]): boolean {
if (parameters.length === 0) {
throw new Error('Please provide at least one number to evaluate isInteger.')
}
const invalid = parameters.some(parameter => !isFunction(parameter))
return !invalid
}
export default function isFunction(parameter: any): boolean {
const tag = baseGetTag(parameter)
return tag === funcTag || tag === genTag || tag === asyncTag || tag === proxyTag
}
/**
* The base implementation of `getTag` without fallbacks for buggy environments.
*
* @private
*/
function baseGetTag(value: any): string {
if (value == null) {
return value === undefined ? undefinedTag : nullTag
}
return symToStringTag in new Object(value) ? getRawTag(value) : objectToString(value)
}
/**
* A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
*
* @private
*/
function getRawTag(value: any): string {
const isOwn = Object.prototype.hasOwnProperty.call(value, symToStringTag)
const tag = value[symToStringTag]
let unmasked = false
try {
value[symToStringTag] = undefined
unmasked = true
} catch (error) {}
const result = objectToString(value)
if (unmasked) {
if (isOwn) {
value[symToStringTag] = tag
} else {
delete value[symToStringTag]
}
}
return result
}
/**
* @private
*/
function objectToString(value: any): string {
return Object.prototype.toString.call(value)
}