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

时间:2018-11-02 16:48:25

标签: javascript node.js typescript ts-node

下面,如果我导入Entity,则会得到帖子的主题错误(TypeError:Object原型可能只是一个Object或null:未定义),但是如果我将导入替换为实际的Entity声明,代码运行正常。

Stackblitz demo here

这是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 }

换句话说,它运行正常并且不产生错误。有想法吗?

2 个答案:

答案 0 :(得分:3)

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

如您所见,将index.ts更改为直接从Entity而不是Customer.ts导入会破坏周期,并且一切都会按预期进行。另一个解决方案是颠倒./Entity中的导入顺序。

答案 1 :(得分:-4)

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

  1. ng update @angular/cli @angular/core --force
  2. npm install
  3. ng serve -o