const { toString } = Object.prototype export function is(val: unknown, type: string) { return toString.call(val) === `[object ${type}]` } export function isDef(val?: T): val is T { return typeof val !== 'undefined' } export function isUnDef(val?: T): val is T { return !isDef(val) } export function isNull(val: unknown): val is null { return val === null } export function isObject(val: any): val is Record { return val !== null && is(val, 'Object') } export function isBoolean(val: unknown): val is boolean { return is(val, 'Boolean') } export function isString(val: unknown): val is string { return is(val, 'String') } export function isArray(val: any): val is any[] { return val && Array.isArray(val) } export function isNullOrUnDef(val: unknown): val is null | undefined { return isUnDef(val) || isNull(val) } export function isEmpty(val: T): val is T { if (isArray(val) || isString(val)) { return val.length === 0 } if (val instanceof Map || val instanceof Set) { return val.size === 0 } if (isObject(val)) { return Object.keys(val).length === 0 } return false } export function isMobile() { return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) }