typescript库项目中无法正常工作示例

xsuvu9jc  于 2023-06-30  发布在  TypeScript
关注(0)|答案(3)|浏览(178)

我构建了一个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项目

3ks5zfa0

3ks5zfa01#

instanceof检查构造函数是否相同。问题是,你的代码从库中的代码中获得了自己的构造函数副本(因为它就是这样,这不是你的错),所以它们不再是同一个示例。
但是,构造函数仍然共享相同的名称:

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

See related question here

piztneat

piztneat2#

使用接受的答案,您可以使用类型 predicate 创建一个收缩函数。
例如:

const isBadRequestException = (error: any): error is BadRequestException => {
  return error.constructor.name === BadRequestException.prototype.constructor.name;
}

然后,您可以使用它来进行对错误对象的后续类型化访问:

if (isBadRequestException(error)) {
  error... // Properties now available
}
14ifxucb

14ifxucb3#

好了,你不能将一个变量声明为类原型并使用instanceof,因为这个变量还没有被示例化。换句话说,B基本上是Object {}。这项工作的工作然而

export const test = error => error instanceof BadRequestException;

但是JS中的类非常奇怪。从技术上讲,所有的“类”都是对象Object {},所以它们的“父”原型,据我所知,它将是Object,覆盖将是BadRequestException
如果你处理类的方式很奇怪,使用prototypeof可能会更好,但我不推荐这样做

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

相关问题