instanceof在打字稿库项目中无法正常工作

时间:2019-12-10 10:27:51

标签: typescript shared-libraries nestjs

我建立了一个打字稿库项目。并使用公共包中的某些类。
假设一个简单的函数来测试它是否为BadRequestException

import { BadRequestException } from "@nestjs/common";
export function test(error) {
  let a = error;
  let b = BadRequestException;
  console.log(a instanceof b);
}

从另一个普通项目构建并导入此shared-lib库后 我这样打了

import { BadRequestException } from "@nestjs/common";
import { test } from 'shared-lib';
test(new BadRequestException('it is a test error'));

在我的视野中(应该是),测试功能中的a instance b应该等于true,但是我得到了false

enter image description here

库项目中使用的BadRequestException是否不同于第二个项目中的"@nestjs/common",即使它们都是从ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); List<ActivityManager.RunningAppProcessInfo> runningAppProcesses = activityManager.getRunningAppProcesses(); if (runningAppProcesses != null) { int importance = runningAppProcesses.get(0).importance; // higher importance has lower number (?) if (importance <= ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) { //start your service the same way you did before in here startService(serviceIntent); } } 导入的?

在Github中上传了demo project

2 个答案:

答案 0 :(得分:0)

好的,您不能将变量声明为类原型并使用instanceof,因为尚未实例化该变量。换句话说,b本质上是Object {}。这项工作有效

export const test = error => error instanceof BadRequestException;

但是JS中的类很奇怪。从技术上讲,所有“类”都是对象Object {},因此据我所知,它们的“父”原型将是Object,而覆盖对象将是BadRequestException

如果您要怪异地处理类,最好使用prototypeof,但我不建议这样做

export const test = error => Reflect.getPrototypeOf(error) === BadRequestException;

答案 1 :(得分:0)

instanceof检查构造函数是否相同。关键是您的代码从库中的代码获取了自己的构造函数副本(因为那样做,这不是您的错),因此它们不再是同一实例。

尽管构造函数仍然共享相同的名称:

error.constructor.name === BadRequestException.prototype.constructor.name

See related question here