Tengo un archivo JSON que contiene dos tipos diferentes de objetos. Quiero iterar sobre el JSON con respecto a su tipo. Para ilustrar mi problema creé dos tipos diferentes de Objeto Animal y Person
Ahora quiero verificar el tipo de Objeto si es un Animal o una Persona.
type Animal = { name: string; legs: number; } type Person = { name: number; } const checkType = (isAnimalOrPerson: Animal | Person) =>{ if(isAnimalOrPerson instanceof Animal){ console.log("animal type"); } else{ } } Aquí recibo un error si la condición dice: "Animal" only refers to a type, but is being used as a value here.
El "problema" con el type es que es un concepto que solo existe durante el desarrollo; una vez que transpila, desaparece, y TypeScript no puede prever la forma de un valor de tiempo de ejecución que podría pasar (a menos que haga una afirmación, es decir, controles explícitos sobre las propiedades que tiene un objeto). Si desea verificar el tipo, debe hacerlo de otra manera, por ejemplo, usando clases, y luego el enfoque solo funcionaría si realmente creara una instancia de la clase (en lugar de solo usarla como una forma):
class Animal { name: string; age: number; legs: number; } class Person { name: string; age: number; job: string; education: string; } let a: Animal = new Animal(); let b: Animal = { name: "Rex", legs: 4, age: 3 }; let c = new Person(); function checkType(arg: Animal | Person): string { if (arg instanceof Animal) { return "This is an animal"; } else if (arg instanceof Person) { return "This is a person"; } return "Can't tell"; } console.log(checkType(a)); // This is an animal console.log(checkType(b)); // Can't tell console.log(checkType(c)); // This is a personHay varias formas de comprobar que el valor PersonorAnimal también satisface Animal .
if ('legs' in toBeDetermined) { // toBeDetermined should be `Animal` in this block }Animal un unique symbol y compruébalo. const animalTag: unique symbol = Symbol("Animal tag"); type Animal = { __brand__: typeof animalTag; name: string; legs: number; } if (toBeDetermined.__brand__ === animalTag) { // toBeDetermined can be coerced manually into Animal } Prefiero 1 porque Animal tiene legs de propiedad disjuntas.
No estoy seguro de si esto te ayudará.
https://www.typescriptlang.org/docs/handbook/2/narrowing.html#using-type-predicates
actualización, acabo de encontrar este aspecto similar a su pregunta https://medium.com/ovrsea/checking-the-type-of-an-object-in-typescript-the-type-guards-24d98d9119b0