typeof funciona para primitivos. in funciona para verificar propiedades. Pero a veces necesitas verificaciones más complejas:
¿Cómo distingues un Perro de un Gato? Ambos tienen nombre. No tienen un discriminante como tipo. Necesitas un type guard personalizado.
Un type guard es una función que devuelve valor is Tipo:
La clave es el tipo de retorno: animal is Perro. Esto le dice a TypeScript: "si esta función devuelve true, el parámetro es de tipo Perro".
Después de llamar al type guard, TypeScript refina el tipo:
Sin el type guard, TypeScript no sabría que animal.ladrar() existe después del if.
Podrías usar "ladrar" in animal, y en muchos casos funciona. Pero los type guards personalizados son mejores cuando:
esAdmin(usuario) es más legible que "permisos" in usuario && usuario.permisos.includes("admin")Si usas clases, instanceof funciona como type guard automáticamente:
Perro (con ladrar()) y Gato (con maullar())esPerro y esGato que devuelvan animal is Perro / animal is GatodescribirAnimal que use los type guards para mostrar info específicaLos type guards personalizados son funciones que enseñan a TypeScript a distinguir tipos. Tú escribes la lógica, TypeScript refina los tipos.