Как правильно экспортировать класс 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 ответов:
если вы используете 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() { ... }