类型错误:对象原型只能是对象或null:未定义。

15

如果我导入Entity,就会出现帖子主题错误(TypeError: Object prototype may only be an Object or null: undefined),但如果我用实际的Entity声明替换导入,代码就可以正常运行。

Stackblitz演示在此处

这是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 }

换句话说,它运行正常且没有出现错误。你有何想法?


你可能写错了 Entity 路径,能否提供路径? - Artyom Amiryan
循环导入会导致执行超过“import”语句,即使目标尚未加载? - Matt McCutchen
等一下!我想你们已经找到解决方法了。我在与其他文件相同的根目录下有一个 index.ts 文件。我从那个文件中重新导出了所有内容,这样我就有了一个集中导入的地方。这就是问题所在。 - Ole
1
我已经仔细检查过了。如果我直接从Entity.ts中导入Entity,就没有问题,但是如果我从index.ts中导入它,则会抛出异常。我觉得这有点奇怪? - Ole
3个回答

27
正如我所怀疑的那样,您的原始程序存在循环引用。 Run.ts 导入 index.ts,后者导入 Customer.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 中的导入顺序。

非常好的观察!我已经将其报告为一个 bug,以防它可以帮助Typescript更好地处理/错误报告这种情况。 - Ole
也许编译器可以检测到循环依赖,并将“./”路径替换为“./Entity”。它们是等效的,而且由于它是运行时代码,每个人都会感到满意... - Ole

0
这并不是对上述示例直接的回答,但是当我使用Vue和Parcel时,我遇到了同样的错误信息,并且有类似的代码。
class Proxy {}

class MyProxy extends Proxy {}

经过一番漫长的调试,发现似乎存在一个类名冲突,与“Proxy”这个名称有关,可能是来自Parcel。当我将超类重命名为“AbstractProxy”或其他任何名称而不是“Proxy”时,它开始工作了。

-6
你可以尝试以下命令并检查应用程序:
  1. ng update @angular/cli @angular/core --force
  2. npm install
  3. ng serve -o

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接