TYPESCRIPT

Type Safe Guards

Comprehensive runtime type checking utilities

TypeScriptType SafetyValidation

Code

// Basic type guards
const isString = (value: unknown): value is string => {
  return typeof value === 'string';
};

const isNumber = (value: unknown): value is number => {
  return typeof value === 'number' && !isNaN(value);
};

const isBoolean = (value: unknown): value is boolean => {
  return typeof value === 'boolean';
};

const isObject = (value: unknown): value is Record<string, unknown> => {
  return value !== null && typeof value === 'object' && !Array.isArray(value);
};

const isArray = <T>(value: unknown, guard?: (item: unknown) => item is T): value is T[] => {
  __TOKEN_26__ (!Array.isArray(value)) return false;
  __TOKEN_28__ (!guard) return true;
  return value.every(guard);
};

// Union type guard
const isUnion = <T extends readonly unknown[]>(
  value: unknown,
  guards: { [K in keyof T]: (v: unknown) => v is T[K] }
): value is T[number] => {
  return guards.some(guard => guard(value));
};

// Schema validation
interface Schema {
  [key: string]: (value: unknown) => boolean;
}

const validateSchema = (value: unknown, schema: Schema): value is Record<string, unknown> => {
  __TOKEN_38__ (!isObject(value)) return false;
  
  __TOKEN_40__ (const [key, validator] of Object.entries(schema)) {
    __TOKEN_43__ (!(key in value) || !validator(value[key])) {
      return false;
    }
  }
  return true;
};

// Usage examples
type User = {
  id: number;
  name: string;
  email: string;
  age?: number;
};

const isUser = (value: unknown): value is User => {
  return validateSchema(value, {
    id: isNumber,
    name: isString,
    email: isString,
    age: (v): v is number => v === undefined || isNumber(v)
  });
};

// Parse with validation
function parseJSON<T>(json: string, guard: (value: unknown) => value is T): T | null {
  try {
    const parsed = JSON.parse(json);
    return guard(parsed) ? parsed : null;
  } catch {
    return null;
  }
}

// Runtime type checking
const data: unknown = { id: 1, name: 'John', email: '[email protected]' };
__TOKEN_57__ (isUser(data)) {
  console.log(data.name); // Type safe access
}