Comment exporter une classe ES6 correctement dans le nœud 4?
Je définis une classe dans un module:
"use strict";
var AspectTypeModule = function() {};
module.exports = AspectTypeModule;
var AspectType = class AspectType {
// ...
};
module.export.AspectType = AspectType;
, Mais je reçois le message d'erreur suivant:
TypeError: Cannot set property 'AspectType' of undefined
at Object.<anonymous> (...AspectType.js:30:26)
at Module._compile (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.
9 réponses
Si vous utilisez ES6 dans le nœud 4, vous ne pouvez pas utiliser la syntaxe du module ES6 sans transpiler, 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' de 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 strict';
module.exports = class Person {
constructor(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
display() {
console.log(this.firstName + " " + this.lastName);
}
}
// index.js
'use strict';
var Person = require('./person.js');
var someone = new Person("First name", "Last name");
someone.display();
expression de classe peut être utilisé pour la simplicité.
// Foo.js
'use strict';
// export default class Foo {}
module.exports = class Foo {}
-
// main.js
'use strict';
const Foo = require('./Foo.js');
let Bar = new class extends Foo {
constructor() {
super();
this.name = 'bar';
}
}
console.log(Bar.name);
Utiliser
// aspect-type.js
class AspectType {
}
export default AspectType;
Puis pour l'importer
// some-other-file.js
import AspectType from './aspect-type';
Lire http://babeljs.io/docs/learn-es2015/#modules pour plus de détails
Avec ECMAScript 2015, vous pouvez exporter et importer plusieurs classes comme ceci
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 collisions de noms, ou si vous préférez d'autres noms, Vous pouvez les renommer comme ceci:
const { Animal : OtherAnimal, Person : OtherPerson} = require("./classes");
const animal = new OtherAnimal();
const person = new OtherPerson();
Plusieurs des autres réponses se rapprochent, mais honnêtement, je pense que vous feriez mieux d'aller avec la syntaxe la plus propre et la plus simple. Le PO a demandé un moyen d'exporter une classe dans ES6 / ES2015. Je ne pense pas que vous pouvez obtenir beaucoup plus propre que ceci:
'use strict';
export default class ClassName {
constructor () {
}
}
Je l'écris simplement de cette façon
Dans le fichier AspectType:
class AspectType {
//blah blah
}
module.exports = AspectType;
Et importez-le comme ceci:
const AspectType = require('./AspectType');
var aspectType = new AspectType;
J'ai eu le même problème. Ce que j'ai trouvé, j'ai appelé ma réception de l'objet le même nom que le nom de la classe. exemple:
const AspectType = new AspectType();
Cette visser les choses de cette façon... j'espère que cela aide
Parfois, j'ai besoin de déclarer plusieurs classes dans un fichier, ou je veux exporter des classes de base et garder leurs noms exportés parce que mon éditeur JetBrains comprend mieux cela. Je viens d'utiliser
global.MyClass = class MyClass { ... };
Et ailleurs:
require('baseclasses.js');
class MySubclass extends MyClass() { ... }