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

新手上路,请多包涵

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

Stackblitz 演示在这里

这是 Customer.ts 在我运行代码时产生错误的形式 ts-node

索引.ts

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

客户.ts

 import { Entity } from "./index";

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

实体.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 }

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

原文由 Ole 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 309
2 个回答

正如我所怀疑的,您的原始程序具有循环导入。 Customer.ts Run.ts 进口 index.ts index.ts Since index.ts is already in the process of loading and itself depends on Customer.ts , the import { Entity } from "./index"; just binds the Entity of index.ts (尚未设置)到 EntityCustomer.ts ,即使 index.ts 加载未完成,执行也会继续。然后 Entity 在您尝试扩展它时未定义。您可能会争辩说循环导入应该是一个错误,或者 JavaScript 引擎应该使用其他一些算法来正确处理您的场景;我没有资格评论为什么选择当前设计。 (其他人可以随意添加有关此的信息。)

如您所见,将 Customer.ts 直接从 ./Entity 导入,而不是 ./index 导入,打破了循环,一切都按预期进行。另一种解决方案是颠倒 index.ts 中的导入顺序。

原文由 Matt McCutchen 发布,翻译遵循 CC BY-SA 4.0 许可协议

这不是对上面示例的直接回答,但是当我有 Vue 和 Parcel 时,我得到了相同的错误消息,以及这种代码:

 class Proxy {}

class MyProxy extends Proxy {}

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

原文由 PHZ.fi-Pharazon 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题