检查 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(); } }
该函数采用Person
or类型的参数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
. 然后我们检查是否false
是Animal
该类的实例。
将表达式括在括号中可以让我们将其作为一个整体进行评估。
如果您不喜欢括号方法,您可以显式检查
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 (!) 运算符相同的目标,但更易于阅读。