Create type-safe guards for runtime type checking with TypeScript
typescript
TypeScript - Advanced Type Guards
// Type predicates for runtime checks
function isString(value: unknown): value is string {
return typeof value === 'string'
}
function isUser(obj: unknown): obj is User {
return (
typeof obj === 'object' &&
obj !== null &&
'id' in obj &&
'email' in obj &&
typeof obj.email === 'string'
)
}
// Discriminated union guard
type Shape =
| { kind: 'circle'; radius: number }
| { kind: 'square'; size: number }
| { kind: 'rectangle'; width: number; height: number }
function getArea(shape: Shape): number {
switch (shape.kind) {
case 'circle':
return Math.PI * shape.radius ** 2
case 'square':
return shape.size ** 2
case 'rectangle':
return shape.width * shape.height
}
}
// Array type guard
function isStringArray(arr: unknown): arr is string[] {
return Array.isArray(arr) && arr.every(item => typeof item === 'string')
}