Web Development
TypeScript
Subjective
Oct 04, 2025
How do you create a type that validates API response schemas?
Detailed Explanation
Use conditional types to validate response structure, mapped types for field validation, and recursive types for nested object validation.
Basic Response Validation:
type APIResponse = {
success: boolean;
data: T;
error?: string;
};
type ValidateResponse = {
[K in keyof Schema]: K extends keyof T
? T[K] extends Schema[K]
? T[K]
: never
: never;
};
// Define expected schema
type UserSchema = {
id: number;
name: string;
email: string;
};
function validateUserResponse(
response: T
): ValidateResponse> {
// Runtime validation logic here
return response as ValidateResponse>;
}
Advanced Nested Validation:
type DeepValidate = {
[K in keyof Schema]: K extends keyof T
? Schema[K] extends object
? T[K] extends object
? DeepValidate
: never
: T[K] extends Schema[K]
? T[K]
: never
: never;
};
type NestedUserSchema = {
user: {
id: number;
profile: {
name: string;
settings: {
theme: string;
notifications: boolean;
};
};
};
};
function validateNestedResponse(
response: T
): DeepValidate {
// Deep validation logic
return response as DeepValidate;
}
Array Response Validation:
type ArrayResponse = {
items: T[];
total: number;
page: number;
};
type ValidateArrayResponse = {
items: ValidateResponse[];
total: number;
page: number;
};
function validateArrayResponse(
response: ArrayResponse
): ValidateArrayResponse {
// Array validation logic
return response as ValidateArrayResponse;
}
Runtime Integration:
function createValidator(schema: Schema) {
return function validate(data: T): ValidateResponse {
// Runtime validation using schema
// Could integrate with libraries like Joi, Yup, or Zod
return data as ValidateResponse;
};
}
const userValidator = createValidator({
id: 'number',
name: 'string',
email: 'string'
});
// Usage
const apiResponse = await fetch('/api/user/123');
const jsonData = await apiResponse.json();
const validatedUser = userValidator(jsonData);
Benefits:
• Compile-time validation of API response structure
• Type-safe data access after validation
• Prevents runtime errors from invalid data
• Integrates well with runtime validation libraries.
Discussion (0)
No comments yet. Be the first to share your thoughts!
Share Your Thoughts