我构建了一个typescript库项目。并使用公共包中的一些类。
让我们假设一个简单函数来测试它是否是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
库项目中使用的BadRequestException
和第二个项目中使用的BadRequestException
是否不同,甚至两者都是从"@nestjs/common"
导入的?
在Github上传了一个demo项目
3条答案
按热度按时间3ks5zfa01#
instanceof检查构造函数是否相同。问题是,你的代码从库中的代码中获得了自己的构造函数副本(因为它就是这样,这不是你的错),所以它们不再是同一个示例。
但是,构造函数仍然共享相同的名称:
See related question here
piztneat2#
使用接受的答案,您可以使用类型 predicate 创建一个收缩函数。
例如:
然后,您可以使用它来进行对错误对象的后续类型化访问:
14ifxucb3#
好了,你不能将一个变量声明为类原型并使用instanceof,因为这个变量还没有被示例化。换句话说,B基本上是
Object {}
。这项工作的工作然而但是JS中的类非常奇怪。从技术上讲,所有的“类”都是对象
Object {}
,所以它们的“父”原型,据我所知,它将是Object,覆盖将是BadRequestException
。如果你处理类的方式很奇怪,使用prototypeof可能会更好,但我不推荐这样做