Comment exporter correctement une classe ES6 dans le Node 4?

Je définis une classe dans un module:

"use ssortingct"; var AspectTypeModule = function() {}; module.exports = AspectTypeModule; var AspectType = class AspectType { // ... }; module.export.AspectType = AspectType; 

Mais j’obtiens le message d’erreur suivant:

 TypeError: Cannot set property 'AspectType' of undefined at Object. (...\AspectType.js:30:26) at Module._comstack (module.js:434:26) .... 

Comment dois-je exporter cette classe et l’utiliser dans un autre module? J’ai vu d’autres questions SO, mais je reçois d’autres messages d’erreur lorsque j’essaie d’implémenter leurs solutions.

Si vous utilisez ES6 dans le nœud 4, vous ne pouvez pas utiliser la syntaxe du module ES6 sans transstackr, mais les modules CommonJS (modules standard du nœud) fonctionnent de la même manière.

 module.export.AspectType 

devrait être

 module.exports.AspectType 

d’où le message d’erreur “Impossible de définir la propriété ‘AspectType’ d’undefined” car module.export === undefined .

Aussi pour

 var AspectType = class AspectType { // ... }; 

pouvez-vous simplement écrire

 class AspectType { // ... } 

et obtenir essentiellement le même comportement.

 // person.js 'use ssortingct'; module.exports = class Person { constructor(firstName, lastName) { this.firstName = firstName; this.lastName = lastName; } display() { console.log(this.firstName + " " + this.lastName); } } 

 // index.js 'use ssortingct'; var Person = require('./person.js'); var someone = new Person("First name", "Last name"); someone.display(); 

l’expression de classe peut être utilisée pour la simplicité.

  // Foo.js 'use ssortingct'; // export default class Foo {} module.exports = class Foo {} 

 // main.js 'use ssortingct'; const Foo = require('./Foo.js'); let Bar = new class extends Foo { constructor() { super(); this.name = 'bar'; } } console.log(Bar.name); 

Utilisation

 // aspect-type.js class AspectType { } export default AspectType; 

Puis l’importer

 // some-other-file.js import AspectType from './aspect-type'; 

Lisez http://babeljs.io/docs/learn-es2015/#modules pour plus de détails.

Plusieurs des autres réponses se rapprochent, mais honnêtement, je pense qu’il vaut mieux aller avec la syntaxe la plus propre et la plus simple. L’OP a demandé un moyen d’exporter une classe dans ES6 / ES2015. Je ne pense pas que vous pouvez obtenir beaucoup plus propre que cela:

 'use ssortingct'; export default class ClassName { constructor () { } } 

Avec ECMAScript 2015, vous pouvez exporter et importer plusieurs classes comme celle-ci

 class Person { constructor() { this.type = "Person"; } } class Animal{ constructor() { this.type = "Animal"; } } module.exports = { Person, Animal }; 

alors où vous les utilisez:

 const { Animal, Person } = require("classes"); const animal = new Animal(); const person = new Person(); 

En cas de collision de noms, ou si vous préférez d’autres noms, vous pouvez les renommer comme suit:

 const { Animal : OtherAnimal, Person : OtherPerson} = require("./classes"); const animal = new OtherAnimal(); const person = new OtherPerson(); 

Je l’écris simplement de cette façon

dans le fichier AspectType:

 class AspectType { //blah blah } module.exports = AspectType; 

et l’importer comme ceci:

 const AspectType = require('./AspectType'); var aspectType = new AspectType; 

J’ai eu le même problème. Ce que j’ai trouvé, c’est que j’ai appelé mon object reçu le même nom que le nom de la classe. Exemple:

 const AspectType = new AspectType(); 

cela a foiré les choses de cette façon … j’espère que ça aide

Parfois, je dois déclarer plusieurs classes dans un fichier, ou je veux exporter des classes de base et conserver leurs noms exportés grâce à mon éditeur JetBrains le comprend mieux. J’utilise juste

 global.MyClass = class MyClass { ... }; 

Et ailleurs:

 require('baseclasses.js'); class MySubclass extends MyClass() { ... }