Considere que tenemos 2 clases Animal y Dog . Aquí la clase Dog se hereda de la clase Animal .
Necesito verificar el tipo de estos objetos.
Cómo puedo conseguir esto
class Animal {} class Dog extends Animal {} //This obj can have both classes const mixedObj: Animal | Dog = new Dog(); //---> here When i compare mixedObj with Animal class i need to get `false` but `true` is returned console.log(mixedObj instanceof Animal);// returns: `true` console.log(mixedObj instanceof Dog);// returns: truetiene alguna otra forma de resolver este problema...?
Fundamentalmente, está preguntando sobre el valor de tiempo de ejecución de mixedObj , que es una cosa de JavaScript en lugar de una cosa de TypeScript.
instanceof Animal será true para cualquier objeto que tenga Animal.prototype en cualquier parte de su cadena de prototipos (normalmente porque fue creado por el constructor Animal , directa o indirectamente [por ejemplo, a través de Dog ]). Si desea ver si mixedObj contiene un Dog , específicamente , y no un Animal , debe mirar la propiedad del constructor :
class Animal {} class Dog extends Animal {} //This obj can have either class const mixedObj/*: Animal | Dog*/ = new Dog(); console.log(mixedObj.constructor === Animal);// returns: `false` console.log(mixedObj.constructor === Dog);// returns: `true` Pero , eso es generalmente un antipatrón. Una mejor manera, particularmente porque funcionará con TypeScript en tiempo de compilación, es darle a Dog alguna característica que Animal no tiene y probar esa característica:
class Animal { } class Dog extends Animal { bark() { console.log("Woof!"); } } //This obj can have either class const mixedObj/*: Animal | Dog*/ = new Dog(); console.log("bark" in mixedObj); // returns: `true` (would be `false` for an `Animal`) if ("bark" in mixedObj) { mixedObj.bark(); // No error, because TypeScript knows that it's a `Dog` }