开发者问题收集

TypeError:对象原型只能是一个对象或为空:未定义

2018-11-02
35134

下面如果我导入 Entity ,我会收到帖子的主题错误(TypeError:对象原型可能只是一个对象或 null:未定义),但如果我用实际的 Entity 声明替换导入,代码运行良好。

Stackblitz 演示在这里

这是 Customer.ts 的形式,当我使用 ts-node 运行代码时会产生错误:

index.ts

export { Customer } from "./Customer";
export { Entity } from "./Entity";

Customer.ts

import { Entity } from "./index";

export class Customer extends Entity {
  sku: string;
  constructor(po: any) {
    super();
    this.sku = po.sku;
  }
}

Entity.ts

export abstract class Entity {
  id?: string;
}    

Run.ts(测试代码)

import {Customer} from "./";

let c = new Customer({
  name: "Bob"
});
console.log(c);

如果我将 Entity 导入替换为如下声明:

export abstract class Entity {
  id?: string;
}    

export class Customer extends Entity {
  sku: string;
  constructor(po: any) {
    super();
    this.sku = po.sku;
  }
}

Run.ts 会记录以下内容:

Customer { sku: undefined }

换句话说,它运行良好并且不会产生任何错误。有什么想法吗?

3个回答

正如我所怀疑的,您的原始程序存在循环导入。 Run.ts 导入 index.ts ,后者又导入 Customer.ts ,后者又再次导入 index.ts 。由于 index.ts 已在加载过程中,并且其本身依赖于 Customer.ts ,因此 import { Entity } from "./index"; 仅将 index.tsEntity (尚未设置)绑定到 Customer.tsEntity ,即使 index.ts 尚未完成加载,执行仍会继续。然后,当您尝试扩展 Entity 时,它是未定义的。您可能会认为循环导入应该是一个错误,或者 JavaScript 引擎应该使用其他能够正确处理您的场景的算法;我没有资格评论为什么选择当前设计。(其他人可以随意添加有关此信息。)

正如您所看到的,将 Customer.ts 更改为直接从 ./Entity 导入,而不是从 ./index 导入,可以打破循环,一切都按预期运行。另一种解决方案是反转 index.ts 中的导入顺序。

Matt McCutchen
2018-11-02

这不是上述示例的直接答案,但是当我拥有 Vue 和 Parcel 以及此类代码时,我收到了相同的错误消息:

class Proxy {}

class MyProxy extends Proxy {}

经过长时间的调试,结果发现似乎存在一些与名称“Proxy”冲突的类名,可能来自 Parcel。在我将超类重命名为“AbstractProxy”或“Proxy”以外的任何其他名称后,它开始工作。

PHZ.fi-Pharazon
2022-03-06

您可以尝试此命令并检查应用程序:

  1. ng update @angular/cli @angular/core --force
  2. npm install
  3. ng serve -o
Kaushik Vaghani
2019-09-14