typescriptのmodule.exports


85

module.exportsの実行方法を誰かが知っていますか?

私はいくつかの異なる方法を試しました

export class Greeter {}

コンパイルされます

exports.Greeter = Greeter;

しかし、私が本当に欲しいのはこれです:

exports = Greeter;

私がこのようにそれを使うことができるように:

import { Greeter } from "greeter";

const greeter = new Greeter();

ではなく

import { Greeter } from "greeter";

const greeter = new Greeter.Greeter();

これはTypescriptで可能ですか?

回答:


78

次のように、TypeScriptで単一のクラスをエクスポートできます。

class Person {

  private firstName: string;
  private lastName: string;

  constructor(firstName: string, lastName: string) {
    this.firstName = firstName;
    this.lastName = lastName;
  }

  public getFullName() {
    return `${this.firstName} ${this.lastName}`;
  }
}

export = Person;

そして、これがどのように使用されるかです:

var Person = require('./dist/commonjs/Person.js');

var homer = new Person('Homer', 'Simpson');
var name = homer.getFullName();

console.log(name); // Homer Simpson

完了するために、これが私のtsconfig.jsonです(私はTypeScript v2.0.3を使用しています):

{
  "compilerOptions": {
    "module": "commonjs",
    "moduleResolution": "node",
    "outDir": "dist/commonjs",
    "rootDir": "src/ts",
    "target": "es5"
  },
  "exclude": [
    "dist",
    "node_modules"
  ]
}

どうもありがとう!typescriptがexportPersonを実装していないのはなぜだろうか... bla bla bla?論理的だと思いますよね?または私は何かが欠けていますか?
ArsenMkrtchyan19年

1
ファイルからいくつかのタイピングをエクスポートすることも可能ですか?テストを作成するためにファイルから型指定を取得したいが、それでもmodule.exports最終的には必要な場合があります。
EricBurel20年

21

これは実装され、TypeScript0.9で準備ができています:)


10
明確にするために(私はこれを掘り下げなければならなかったので)、0.9の構文はここで利用可能です:blogs.msdn.com/b/typescript/archive/2013/06/18/…( "Export ="の下)。
ダン

3
そして、さらに明確化のため、将来の読者のために、それが実装されているALMOSTアスカーは、必要に応じて正確に。。。しかし、私が本当に望んでいるのは export = Greeter;、まさにそれがあなたがしていることです:)
Binary Worrier 2014

1
からconfig/db.ts構成オブジェクトを公開し、その構成をアプリで使用したかっただけです。これは私が活字体1.4で正常に何ができるかです:でconfig/db.ts書き込みvar config = {connStr:'postgres://user:pass@host/dbname'}; export = config;とでapp.tsて、それを参照してくださいimport dbConfig = require('./config/db'); dbConnect(dbConfig.connStr);
Gurjeetシン

10

だから私は回避策を見つけたと思います。キーワード「モジュール」を.tsファイルの括弧で囲むだけです。

declare var module: any;
(module).exports = MyClass;

生成されたjavascriptファイルはまったく同じになります。

(module).exports = MyClass;

自分でvarモジュールを宣言するよりも、node.d.ts定義ファイルをダウンロードして、typescriptファイルと同じディレクトリに貼り付けることに注意してください。以下は、node.d.tsが同じディレクトリにあることを前提としたエクスプレスnode.jsルーティングファイルの完全なサンプルです。

/// <reference path="node.d.ts" />
var SheetController = function () {
    this.view = function (req, res) {
        res.render('view-sheet');
    };
};
(module).exports = SheetController;

次に、SheetControllerを新しくし、(expressを使用して)viewメソッドを割り当てることができます。

var sheetController = new SheetController();
app.get('/sheet/view', sheetController.view);

このパターンを使用して、任意のキーワードをエスケープできると思います。

declare var reservedkeyword: any;
(reservedkeyword).anything = something;

2

それは醜くてハッキーですが、それでもあなたはすることができます:

class Greeter {}
declare var exports:any;
exports = Greeter;

これは次のようにコンパイルされます。

var Greeter = (function () {
    function Greeter() { }
    return Greeter;
})();
exports = Greeter;

1
残念ながら、TypeScriptコンパイラはこれをうまく処理できないようです。たとえば、これを行うときにクラスから派生することはできません。
dcstraw 2012年

これはどのように機能しますか?CommonJs対AMDの議論全体ではありません。そのコモンは、エクスポート変数として直接ものを返すことをサポートしていませんか?
ジョージマウアー2012年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.