Как правильно экспортировать класс ES6 в узел 4?


Я определяю класс в модуле:

"use strict";

var AspectTypeModule = function() {};
module.exports = AspectTypeModule;

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

module.export.AspectType = AspectType;

но я получаю следующее сообщение об ошибке:

TypeError: Cannot set property 'AspectType' of undefined
    at Object.<anonymous> (...AspectType.js:30:26)
    at Module._compile (module.js:434:26)
    ....

Как мне экспортировать этот класс и использовать его в другом модуле? Я видел другие вопросы SO, но я получаю другие сообщения об ошибках, когда пытаюсь реализовать их решения.

9 57

9 ответов:

если вы используете ES6 в узле 4, Вы не можете использовать синтаксис модуля ES6 без транспилера, но модули CommonJS (стандартные модули узла) работают одинаково.

module.export.AspectType

должно быть

module.exports.AspectType

отсюда сообщение об ошибке "не удается установить свойство 'AspectType ' неопределенного" потому что module.export === undefined.

кроме того, для

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

вы можете просто написать

class AspectType {
    // ...    
}

и получить по существу то же самое поведение.

// 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();

выражение класс может использоваться для простоты.

 // 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);

использовать

// aspect-type.js
class AspectType {

}

export default AspectType;

затем импортировать его

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

читать http://babeljs.io/docs/learn-es2015/#modules для более подробной информации

С ECMAScript 2015 Вы можете экспортировать и импортировать несколько классов, как это

class Person
{
    constructor()
    {
        this.type = "Person";
    }
}

class Animal{
    constructor()
    {
        this.type = "Animal";
    }
}

module.exports = {
    Person,
    Animal
};

тогда где вы их используете:

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

const animal = new Animal();
const person = new Person();

в случае коллизий имен, или вы предпочитаете другие имена, вы можете переименовать их следующим образом:

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

const animal = new OtherAnimal();
const person = new OtherPerson();

несколько других ответов подходят близко, но, честно говоря, я думаю, что вам лучше пойти с самым чистым, самым простым синтаксисом. ОП запросила средство экспорта класса в ES6 / ES2015. Я не думаю, что вы можете получить намного чище, чем это:

'use strict';

export default class ClassName {
  constructor () {
  }
}

Я просто пишу это так

в файле AspectType:

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

и импортировать его, как это:

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

У меня была та же проблема. То, что я нашел, было названо моим получающим объектом тем же именем, что и имя класса. пример:

const AspectType = new AspectType();

это все испортило таким образом... надеюсь, это поможет

иногда мне нужно объявить несколько классов в одном файле, или я хочу экспортировать базовые классы и сохранить их имена экспортированными, потому что мой редактор JetBrains понимает это лучше. Я просто использую

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

и где-то еще:

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