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

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

Check if Object is instance of Class in TypeScript

使用instanceof运算符检查对象是否是类的实例,例如if (myObj instanceof MyClass) {}. instanceof运算符检查构造函数的属性是否
出现
prototype在对象的原型链中,true如果出现则返回。

索引.ts
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 中非常有用,因为它可以用作
类型保护

索引.ts
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(); } }

该函数采用Personor类型的参数Animal,因此在我们访问特定于类的方法之前,我们必须检查传递给该函数的类的实例。

如果访问该constructor.name属性,可以看到p1对象的类名是Person.

索引.ts
class Person {} const p1 = new Person(); console.log(p1.constructor.name); // 👉️ Person

我们访问了Object.constructorname属性上的

属性。

Object.constructor属性返回对构造函数的引用,从中创建对象。

instanceof运算符检查对象constructor.prototype原型链中是否存在。

索引.ts
class Person {} const p1 = new Person(); // 👇️ true console.log(Object.getPrototypeOf(p1) === Person.prototype);

请注意,检查对象是否不是类的实例有点棘手。

索引.ts
class Person {} class Animal {} const person = new Person(); if (!(person instanceof Animal)) { console.log('person is NOT an instance of Animal'); }

请注意,我们在取消instanceof
检查之前
使用了括号

一个常见的错误是省略括号,例如:

索引.ts
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. 然后我们检查是否falseAnimal
该类的实例。

将表达式括在括号中可以让我们将其作为一个整体进行评估。

如果您不喜欢括号方法,您可以显式检查
instanceof运算符是否返回false.

索引.ts
class Person {} class Animal {} const person = new Person(); if (person instanceof Animal === false) { console.log('person is NOT an instance of Animal'); }

这实现了与使用带括号的逻辑 NOT (!) 运算符相同的目标,但更易于阅读。