export function typeOf(v: unknown): string { return typeof v; } export function isSymbol(v: unknown): v is T { return typeof v === 'symbol'; } export function isObject(v: unknown): v is T { return v !== null && typeOf(v) === 'object'; } export function isString(v: unknown): v is string { return typeOf(v) === 'string'; } export function isNumber(v: unknown): v is number { return typeOf(v) === 'number' && !Number.isNaN(v as number) && Number.isFinite(v as number); } export function isUndefined(v: unknown): v is undefined { return typeOf(v) === 'undefined'; } export function isArray(v: unknown): v is T[] { return Array.isArray(v); } export function isBoolean(v: unknown): v is boolean { return typeof v === 'boolean' || v instanceof Boolean; } // eslint-disable-next-line @typescript-eslint/no-explicit-any export type AnyFn = (...args: any[]) => any; // eslint-disable-next-line @typescript-eslint/no-explicit-any export type AnyObj = Record; export function isFunction(v: unknown): v is T { return typeOf(v) === 'function'; } export function isPromise(obj: unknown): obj is Promise { return isObject(obj) && isFunction(obj.then); }