TypeError:对象原型只能是一个对象或为空:未定义
下面如果我导入
Entity
,我会收到帖子的主题错误(TypeError:对象原型可能只是一个对象或 null:未定义),但如果我用实际的
Entity
声明替换导入,代码运行良好。
这是
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.ts
的
Entity
(尚未设置)绑定到
Customer.ts
的
Entity
,即使
index.ts
尚未完成加载,执行仍会继续。然后,当您尝试扩展
Entity
时,它是未定义的。您可能会认为循环导入应该是一个错误,或者 JavaScript 引擎应该使用其他能够正确处理您的场景的算法;我没有资格评论为什么选择当前设计。(其他人可以随意添加有关此信息。)
正如您所看到的,将
Customer.ts
更改为直接从
./Entity
导入,而不是从
./index
导入,可以打破循环,一切都按预期运行。另一种解决方案是反转
index.ts
中的导入顺序。
这不是上述示例的直接答案,但是当我拥有 Vue 和 Parcel 以及此类代码时,我收到了相同的错误消息:
class Proxy {}
class MyProxy extends Proxy {}
经过长时间的调试,结果发现似乎存在一些与名称“Proxy”冲突的类名,可能来自 Parcel。在我将超类重命名为“AbstractProxy”或“Proxy”以外的任何其他名称后,它开始工作。
您可以尝试此命令并检查应用程序:
-
ng update @angular/cli @angular/core --force
-
npm install
-
ng serve -o