modules.exports in typescript

Ker*_*ten 72 import commonjs typescript

有人知道怎么做module.exports?

我尝试了一些不同的方式

export class Greeter {}
Run Code Online (Sandbox Code Playgroud)

将编译为

exports.Greeter = Greeter;
Run Code Online (Sandbox Code Playgroud)

但我真正想要的是:

exports = Greeter;
Run Code Online (Sandbox Code Playgroud)

所以我可以像这样使用它:

import { Greeter } from "greeter";

const greeter = new Greeter();
Run Code Online (Sandbox Code Playgroud)

并不是

import { Greeter } from "greeter";

const greeter = new Greeter.Greeter();
Run Code Online (Sandbox Code Playgroud)

这可能与Typescript有关吗?

Ben*_*uer 65

您可以在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;
Run Code Online (Sandbox Code Playgroud)

以下是它将如何使用:

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

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

console.log(name); // Homer Simpson
Run Code Online (Sandbox Code Playgroud)

要完成,这是我的tsconfig.json(我使用的是TypeScript v2.0.3):

{
  "compilerOptions": {
    "module": "commonjs",
    "moduleResolution": "node",
    "outDir": "dist/commonjs",
    "rootDir": "src/ts",
    "target": "es5"
  },
  "exclude": [
    "dist",
    "node_modules"
  ]
}
Run Code Online (Sandbox Code Playgroud)


Ker*_*ten 20

这已经实现,并在TypeScript 0.9中准备好了:)

  • 为了澄清(因为我不得不深入研究),0.9中的语法可以在这里找到:http://blogs.msdn.com/b/typescript/archive/2013/06/18/announcing-typescript-0-9 .aspx(在"Export ="下). (10认同)
  • 为了进一步澄清,对于未来的读者来说,它已经完全按照提问者的要求实现了**..._但我真正想要的是``export = Greeter;`,这正是你做的:) (3认同)

Dan*_*wer 9

所以我想我找到了一个解决方法.只需将关键字"module"包装在.ts文件的括号中:

declare var module: any;
(module).exports = MyClass;
Run Code Online (Sandbox Code Playgroud)

生成的javascript文件将完全相同:

(module).exports = MyClass;
Run Code Online (Sandbox Code Playgroud)

注意,比自己声明var模块更好,下载node.d.ts定义文件并将其粘贴在与typescript文件相同的目录中.以下是express node.js路由文件的完整示例,该文件假定node.d.ts位于同一目录中:

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

然后我可以新建一个SheetController并(使用express)分配视图方法:

var sheetController = new SheetController();
app.get('/sheet/view', sheetController.view);
Run Code Online (Sandbox Code Playgroud)

我想任何关键字都可以使用这种模式进行转义:

declare var reservedkeyword: any;
(reservedkeyword).anything = something;
Run Code Online (Sandbox Code Playgroud)