Type Safe Guards
Comprehensive runtime type checking utilities
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
}