如何在 Typescript 中比较 2 个继承的 类
How to compare 2 inherited classes in Typescript
假设我们有 2 classes Animal
和 Dog
。这里Dog
class继承自Animal
class.
我需要检查这个对象的类型
我怎样才能做到这一点
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: true
还有其他方法可以解决这个问题吗...?
从根本上说,您是在询问 mixedObj
的 runtime 值,这是 JavaScript 的东西而不是 TypeScript 的东西。
instanceof Animal
对于任何在其原型链中的任何位置具有 Animal.prototype
的对象来说都是 true
(通常是因为它是由 Animal
构造函数直接或间接创建的[例如,通过 Dog
])。如果您想查看 mixedObj
是否包含 Dog
、,特别是 ,而不是 Animal
,您需要查看 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`
但是,这通常是一种反模式。一个更好的方法,特别是因为它将在 compile-time 上与 TypeScript 一起工作,是给 Dog
一些 Animal
没有的特性并测试该特性:
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`
}
假设我们有 2 classes Animal
和 Dog
。这里Dog
class继承自Animal
class.
我需要检查这个对象的类型
我怎样才能做到这一点
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: true
还有其他方法可以解决这个问题吗...?
从根本上说,您是在询问 mixedObj
的 runtime 值,这是 JavaScript 的东西而不是 TypeScript 的东西。
instanceof Animal
对于任何在其原型链中的任何位置具有 Animal.prototype
的对象来说都是 true
(通常是因为它是由 Animal
构造函数直接或间接创建的[例如,通过 Dog
])。如果您想查看 mixedObj
是否包含 Dog
、,特别是 ,而不是 Animal
,您需要查看 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`
但是,这通常是一种反模式。一个更好的方法,特别是因为它将在 compile-time 上与 TypeScript 一起工作,是给 Dog
一些 Animal
没有的特性并测试该特性:
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`
}