web-dev-qa-db-ja.com

ノード4でES6クラスを正しいエキスパートする方法

私はモジュールの中でクラスを定義しました:

"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質問がありますが、それらのソリューションを実装しようとすると他のエラーメッセージが表示されます。

80

ノード4でES6を使用している場合、transpilerなしでES6モジュール構文を使用することはできませんが、CommonJSモジュール(ノードの標準モジュール)は同じように機能します。

module.export.AspectType

あるべき

module.exports.AspectType

したがってmodule.export === undefinedであるため、エラーメッセージ「未定義のプロパティ 'AspectType'を設定できません」が表示されます。

また、

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

あなただけ書くことができます

class AspectType {
    // ...    
}

基本的に同じ動作をします。

95
loganfsmyth
// 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();
93
sitrakay

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();
29
Jonas Brandel

つかいます

// aspect-type.js
class AspectType {

}

export default AspectType;

それをインポートする

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

詳細については、 http://babeljs.io/docs/learn-es2015/#modules を参照してください。

13
user633183

クラス式は単純化するために使用できます。

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

他の答えのいくつかは接近してくるが、正直なところ、私はあなたが最もクリーンで最も単純な構文を使った方が良いと思う。 OPがES6/ES2015のクラスをエクスポートする手段を要求しました。私はあなたがこれよりずっときれいになることができるとは思わない:

'use strict';

export default class ClassName {
  constructor () {
  }
}
8
Crates

私は単純にこう書きます

aspectTypeファイルで:

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

そしてこれを次のようにインポートします。

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

私は同じ問題を抱えていました。私が見つけたのは、私が受け取るオブジェクトをクラス名と同じ名前にしたことです。例:

const AspectType = new AspectType();

これはそのようにして物事を台無しにしました...これが役立つことを願っています

0
shahar taite