Fading Coder

One Final Commit for the Last Sprint

Home > Tech > Content

TypeScript Utility Functions for Runtime Type Checks

Tech May 10 4

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;

Related Articles

Understanding Strong and Weak References in Java

Strong References Strong reference are the most prevalent type of object referencing in Java. When an object has a strong reference pointing to it, the garbage collector will not reclaim its memory. F...

Comprehensive Guide to SSTI Explained with Payload Bypass Techniques

Introduction Server-Side Template Injection (SSTI) is a vulnerability in web applications where user input is improper handled within the template engine and executed on the server. This exploit can r...

Implement Image Upload Functionality for Django Integrated TinyMCE Editor

Django’s Admin panel is highly user-friendly, and pairing it with TinyMCE, an effective rich text editor, simplifies content management significantly. Combining the two is particular useful for bloggi...

Leave a Comment

Anonymous

◎Feel free to join the discussion and share your thoughts.