TypeError: Прототипом Object может быть только Object или null: undefined - PullRequest
0 голосов
/ 02 ноября 2018

Ниже, если я импортирую Entity, я получаю сообщение об ошибке в теме сообщения (TypeError: Прототип объекта может быть только Object или 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 }

Другими словами, он работает нормально и не выдает ошибок. Мысли?

1 Ответ

0 голосов
/ 02 ноября 2018

Как я и подозревал, ваша оригинальная программа имеет циклический импорт. Run.ts импортирует index.ts, который импортирует Customer.ts, который снова импортирует index.ts. Поскольку index.ts уже находится в процессе загрузки и зависит от Customer.ts, import { Entity } from "./index"; просто связывает Entity из index.ts (который еще не установлен) с Entity из Customer.ts, и выполнение продолжается, даже если index.ts не завершил загрузку. Тогда Entity не определено в то время, когда вы пытаетесь его расширить. Вы можете утверждать, что циклический импорт должен быть ошибкой или что движки JavaScript должны использовать какой-то другой алгоритм, который правильно обрабатывает ваш сценарий; Я не имею права комментировать, почему был выбран текущий дизайн. (Другие могут добавить информацию об этом.)

Как вы видели, изменение Customer.ts для импорта из ./Entity напрямую вместо ./index прерывает цикл, и все работает, как и ожидалось. Другим решением было бы изменить порядок импорта в index.ts.

...