TypeScript 中 检查 Object 是否是 Class 的实例
使用 instanceof
运算符检查对象是否是类的实例,例如 if (myObj instanceof MyClass) {}
。 instanceof
运算符检查构造函数的原型属性是否出现在对象的原型链中,如果出现则返回 true。
class Person {}
const p1 = new Person();
if (p1 instanceof Person) {
console.log('✅ is instance of Person');
} else {
console.log('⛔️ is not instance of Person');
}
class Animal {}
console.log(p1 instanceof Animal); // 👉️ false
instanceof
运算符返回一个布尔值,表示构造函数的原型属性是否出现在对象的原型链中。
p1
对象是使用Person
类创建的,因此它是该类的一个实例。
instanceof
运算符在 TypeScript 中非常有用,因为它可以用作类型保护。
class Person {
walk() {
console.log('person is walking');
}
}
class Animal {
run() {
console.log('animal is running');
}
}
function example(x: Person | Animal) {
// 👉️ x is type Person or Animal here
if (x instanceof Person) {
// 👇️ x is type Person here
x.walk();
} else {
// 👇️ x is type Animal here
x.run();
}
}
该函数采用 Person 或 Animal 类型的参数,因此在我们访问特定于类的方法之前,我们必须检查传递给该函数的类的实例。
如果访问 constructor.name
属性,可以看到 p1 对象的类名是 Person。
class Person {}
const p1 = new Person();
console.log(p1.constructor.name); // 👉️ Person
我们访问了 Object.constructor
属性上的 name 属性。
Object.constructor
属性返回对构造函数的引用,从中创建对象。
instanceof
运算符检查对象原型链中是否存在 constructor.prototype
。
class Person {}
const p1 = new Person();
// 👇️ true
console.log(Object.getPrototypeOf(p1) === Person.prototype);
注意
,检查对象是否不是类的实例有点棘手。
class Person {}
class Animal {}
const person = new Person();
if (!(person instanceof Animal)) {
console.log('person is NOT an instance of Animal');
}
请注意
,我们在取消instanceof
检查之前使用了括号。
一个常见的错误是省略括号,例如:
class Person {}
class Animal {}
const person = new Person();
// 👇️ Don't do this
// ⛔️ Error: The left-hand side of an 'instanceof'
// expression must be of type 'any', an object type
// or a type parameter.ts(2358)
if (!person instanceof Animal) {
console.log('person is NOT an instance of Animal');
}
此代码示例反转对象的值并将其转换为布尔值,因此它变为 false。 然后我们检查 false 是否是 Animal
类的实例。
将表达式括在括号中可以让我们将其作为一个整体进行评估。
如果不喜欢括号方法,我们可以显式检查 instanceof
运算符是否返回 false。
class Person {}
class Animal {}
const person = new Person();
if (person instanceof Animal === false) {
console.log('person is NOT an instance of Animal');
}
这实现了与使用带括号的逻辑 NOT !
运算符相同的目标,但更易于阅读。
相关文章
在 AngularJs 中设置 Select From Typescript 的默认选项值
发布时间:2023/04/14 浏览次数:78 分类:Angular
-
本教程提供了在 AngularJs 中从 TypeScript 中设置 HTML 标记选择的默认选项的解释性解决方案。
在 Angular 中使用 TypeScript 的 getElementById 替换
发布时间:2023/04/14 浏览次数:153 分类:Angular
-
本教程指南提供了有关使用 TypeScript 在 Angular 中替换 document.getElementById 的简要说明。这也提供了在 Angular 中 getElementById 的最佳方法。
在 TypeScript 中使用 try..catch..finally 处理异常
发布时间:2023/03/19 浏览次数:181 分类:TypeScript
-
本文详细介绍了如何在 TypeScript 中使用 try..catch..finally 进行异常处理,并附有示例。
在 TypeScript 中使用 declare 关键字
发布时间:2023/03/19 浏览次数:97 分类:TypeScript
-
本教程指南通过特定的实现和编码示例深入了解了 TypeScript 中 declare 关键字的用途。
在 TypeScript 中 get 和 set
发布时间:2023/03/19 浏览次数:172 分类:TypeScript
-
本篇文章演示了类的 get 和 set 属性以及如何在 TypeScript 中实现它。
在 TypeScript 中格式化日期和时间
发布时间:2023/03/19 浏览次数:161 分类:TypeScript
-
本教程介绍内置对象 Date() 并讨论在 Typescript 中获取、设置和格式化日期和时间的各种方法。
在 TypeScript 中返回一个 Promise
发布时间:2023/03/19 浏览次数:182 分类:TypeScript
-
本教程讨论如何在 TypeScript 中返回正确的 Promise。这将提供 TypeScript 中 Returns Promise 的完整编码示例,并完整演示每个步骤。
在 TypeScript 中定义函数回调的类型
发布时间:2023/03/19 浏览次数:221 分类:TypeScript
-
本教程说明了在 TypeScript 中为函数回调定义类型的解决方案。为了程序员的方便和方便,实施了不同的编码实践指南。
在 TypeScript 中把 JSON 对象转换为一个类
发布时间:2023/03/19 浏览次数:110 分类:TypeScript
-
本教程演示了如何将 JSON 对象转换为 TypeScript 中的类。