Core Type Matching Function
const typeString = Object.prototype.toString;
export function matchesType(input: unknown, expectedType: string): boolean {
return typeString.call(input) === `[object ${expectedType}]`;
}
Check if Defined
export function isDefined<T = unknown>(value?: T): value is T {
return typeof value !== 'undefined';
}
export function isUndefined<T = unknown>(value: T): value is T {
return !isDefined(value);
}
Check if String
export function isString(input: unknown): input is string {
return matchesType(input, 'String');
}
Check if Object
export function isObjectLike(input: any): input is Record<any, any> {
return input !== null && matchesType(input, 'Object');
}
Check if Array
export function isArray(input: any): input is any[] {
return Array.isArray(input);
}
Check if Map
export function isMap(input: unknown): input is Map<any, any> {
return matchesType(input, 'Map');
}
Check if Null
export function isNull(input: unknown): input is null {
return input === null;
}
Check if Empty
export function isEmpty<T = unknown>(input: T): boolean {
if (isArray(input) || isString(input)) {
return input.length === 0;
}
if (input instanceof Map || input instanceof Set) {
return input.size === 0;
}
if (isObjectLike(input)) {
return Object.keys(input).length === 0;
}
return false;
}
Check if Function
export function isFunction(input: unknown): input is Function {
return typeof input === 'function';
}
Check if Boolean
export function isBoolean(input: any): input is boolean {
return matchesType(input, 'Boolean');
}
Check if Number
export function isNumber(input: unknown): input is number {
return matchesType(input, 'Number');
}
Check if Date
export function isDate(input: unknown): input is Date {
return matchesType(input, 'Date');
}
Check if RegExp
export function isRegExp(input: unknown): input is RegExp {
return matchesType(input, 'RegExp');
}
Check if URL
export function isUrl(url: string): boolean {
const pattern = /(((^https?:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+(?::\d+)?|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)$/;
return pattern.test(url);
}
Check if Promise
export function isPromise<T = any>(input: any): input is Promise<T> {
return matchesType(input, 'Promise') && isFunction(input.then) && isFunction(input.catch);
}
Check if JSON Object String
export function isJsonObjectString(str: string): str is string {
if (!str) return false;
return str.startsWith('{') && str.endsWith('}');
}
Check if Window Object
export function isWindowObject(input: any): input is Window {
return typeof window !== 'undefined' && matchesType(input, 'Window');
}
Check if DOM Element
export function isDomElement(input: unknown): input is Element {
return isObjectLike(input) && !!input.tagName;
}
Server Environmnet Check
export const isServer = typeof window === 'undefined';
Browser Environmetn Check
export const isBrowser = !isServer;