web-dev-qa-db-fra.com

TypeError: le prototype d'objet peut uniquement être un objet ou null: undefined

Ci-dessous si j'importe Entity j'obtiens l'erreur de sujet des messages (TypeError: le prototype d'objet peut seulement être un objet ou null: undefined), mais si je remplace l'importation par la déclaration réelle Entity le code fonctionne bien.

Démo Stackblitz ici .

C'est Customer.ts sous la forme qui produit l'erreur lorsque j'exécute le code avec 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 (Le code de test)

import {Customer} from "./";

let c = new Customer({
  name: "Bob"
});
console.log(c);

Si je remplace l'import Entity par la déclaration comme ceci:

export abstract class Entity {
  id?: string;
}    

export class Customer extends Entity {
  sku: string;
  constructor(po: any) {
    super();
    this.sku = po.sku;
  }
}

Ensuite Run.ts enregistre ceci:

Customer { sku: undefined }

En d'autres termes, il fonctionne correctement et ne produit aucune erreur. Pensées?

8
Ole

Comme je le soupçonnais, votre programme d'origine a des importations circulaires. Run.ts importe index.ts, qui importe Customer.ts, qui importe index.ts encore. Puisque index.ts est déjà en cours de chargement et dépend lui-même de Customer.ts, les import { Entity } from "./index"; lie simplement le Entity de index.ts (qui n'est pas encore défini) au Entity de Customer.ts, et l'exécution continue même si index.ts le chargement n'est pas terminé. Entity n'est alors pas défini au moment où vous essayez de l'étendre. Vous pourriez faire valoir qu'une importation circulaire devrait être une erreur ou que les moteurs JavaScript devraient utiliser un autre algorithme qui gère correctement votre scénario; Je ne suis pas qualifié pour expliquer pourquoi le design actuel a été choisi. (D'autres se sentent libres d'ajouter des informations à ce sujet.)

Comme vous l'avez vu, changer Customer.ts pour importer depuis ./Entity directement au lieu de ./index rompt le cycle et tout fonctionne comme prévu. Une autre solution serait d'inverser l'ordre des importations dans index.ts.

11
Matt McCutchen