TypeError: Object prototype may only be an Object or null: undefined

TypeError: Object prototype may only be an Object or null: undefined

下面如果我导入 Entity 我会得到帖子的主题错误(类型错误:对象原型可能只是一个对象或 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 }

换句话说,它 运行 没问题,不会产生任何错误。想法?

正如我所怀疑的,您的原始程序具有循环导入。 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.

中的导入顺序

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

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

这不是对上面例子的直接回答,但我在使用 Vue 和 Parcel 时得到了同样的错误信息,这种代码:

class Proxy {}

class MyProxy extends Proxy {}

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