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.
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?
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
.