TypeError:对象原型可能只是一个对象或空:未定义
Posted
技术标签:
【中文标题】TypeError:对象原型可能只是一个对象或空:未定义【英文标题】:TypeError: Object prototype may only be an Object or null: undefined 【发布时间】:2019-04-06 22:40:38 【问题描述】:如果我在下面导入Entity
,我会收到帖子的主题错误(TypeError:对象原型可能只是一个对象或null:未定义),但如果我用实际的Entity
声明替换导入,代码运行良好。
Stackblitz demo here.
这是Customer.ts
在我使用ts-node
运行代码时产生错误的形式:
index.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;
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
换句话说,它运行良好并且不会产生错误。想法?
【问题讨论】:
可能你写的Entity
路径错了?,你也可以提供路径吗?
循环导入导致执行通过import
语句,即使目标尚未加载?
按住新闻!我想你们想通了。我在与其他文件相同的根目录中有一个 index.ts
。我正在重新导出该文件中的所有内容,因此我有一个可以从中导入的中心位置。这就是它的原因。
双重检查。如果我直接从Entity.ts
导入Entity
没有问题,但是如果我从index.ts
导入它,则会引发异常。我觉得这有点奇怪?
【参考方案1】:
正如我所怀疑的,您的原始程序具有循环导入。 Run.ts
导入index.ts
,它导入Customer.ts
,它再次导入index.ts
。由于index.ts
已经在加载过程中并且本身依赖于Customer.ts
,所以import Entity from "./index";
只是将index.ts
的Entity
(还没有设置)绑定到Customer.ts
的Entity
,即使index.ts
没有完成加载,也会继续执行。然后 Entity
在您尝试扩展它时未定义。您可能会争辩说循环导入应该是一个错误,或者 javascript 引擎应该使用其他一些可以正确处理您的场景的算法;我没有资格评论为什么选择当前的设计。 (其他人可以随意添加相关信息。)
如您所见,将Customer.ts
更改为直接从./Entity
导入而不是./index
会破坏循环,并且一切都按预期进行。另一种解决方案是颠倒index.ts
中的导入顺序。
【讨论】:
出色的观察!我将其报告为错误,以防万一它可以帮助 Typescript 为这种情况设计更好的处理/错误报告。 也许编译器可以检测到循环依赖,只需将./
路径替换为./Entity
。它们是等价的,因为它是运行时代码,所以每个人都很高兴......【参考方案2】:
你可以试试这个命令并检查应用程序:
ng update @angular/cli @angular/core --force
npm install
ng serve -o
【讨论】:
以上是关于TypeError:对象原型可能只是一个对象或空:未定义的主要内容,如果未能解决你的问题,请参考以下文章
Webpack错误:TypeError:对象原型可能只是一个对象或null:未定义
TypeError:删除对象的键时无法将未定义或空值转换为对象