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
替换导入声明代码 运行 没问题。
这是 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
.
中的导入顺序
您可以尝试这个命令并检查应用程序:
ng update @angular/cli @angular/core --force
npm install
ng serve -o
这不是对上面例子的直接回答,但我在使用 Vue 和 Parcel 时得到了同样的错误信息,这种代码:
class Proxy {}
class MyProxy extends Proxy {}
经过长时间的调试,结果发现似乎有一些 class 名称与名称“Proxy”冲突,可能来自 Parcel。在我将 super class 重命名为“AbstractProxy”或“Proxy”以外的任何其他名称后,它开始工作了。
下面如果我导入 Entity
我会得到帖子的主题错误(类型错误:对象原型可能只是一个对象或 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
.
您可以尝试这个命令并检查应用程序:
ng update @angular/cli @angular/core --force
npm install
ng serve -o
这不是对上面例子的直接回答,但我在使用 Vue 和 Parcel 时得到了同样的错误信息,这种代码:
class Proxy {}
class MyProxy extends Proxy {}
经过长时间的调试,结果发现似乎有一些 class 名称与名称“Proxy”冲突,可能来自 Parcel。在我将 super class 重命名为“AbstractProxy”或“Proxy”以外的任何其他名称后,它开始工作了。