迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > TypeScript >

TypeScript 中 检查 Object 是否是 Class 的实例

作者:迹忆客 最近更新:2022/12/11 浏览次数:

使用 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

TypeScript 中 检查 Object 是否是 Class 的实例

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');
}

Error: The left-hand side of an 'instanceof'

此代码示例反转对象的值并将其转换为布尔值,因此它变为 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 ! 运算符相同的目标,但更易于阅读。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

在 TypeScript 中返回一个 Promise

发布时间:2023/03/19 浏览次数:182 分类:TypeScript

本教程讨论如何在 TypeScript 中返回正确的 Promise。这将提供 TypeScript 中 Returns Promise 的完整编码示例,并完整演示每个步骤。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便