typescript中的module.exports


84

有人知道如何做一个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可以吗?

Answers:


77

您可以像这样在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"
  ]
}

非常感谢!我不知道为什么打字稿没有实现输出人... bla bla bla?我认为这是合乎逻辑的,不是吗?还是我缺少什么?
阿森·姆克特奇扬

1
是否还可以从文件中导出某些类型的文字?您可能希望从文件中键入内容以编写测试,但最后仍然需要a module.exports
Eric Burel

21

现在已经实现,并且可以在TypeScript 0.9中准备好:)


10
为了澄清起见(因为我不得不对此进行深入研究),可以在此处使用0.9中的语法:blogs.msdn.com/b/typescript/archive/2013/06/18/…(在“导出=”下)。
2013年

3
为了进一步澄清,对于将来的读者,已经完全按照请求者的意愿实施了ALMOST。。。但是我真正想要的是 export = Greeter;,这就是您的工作:)
Binary Worrier 2014年

1
我只想公开一个配置对象,config/db.ts并在应用程序中使用该配置。这是我可以在TypeScript 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 Singh

10

所以我想我已经找到了解决方法。只需在.ts文件中的括号中加上关键字“模块”即可:

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

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

(module).exports = MyClass;

请注意,比自己声明var模块更好,请下载node.d.ts定义文件并将其粘贴在与打字稿文件相同的目录中。这是一个快速的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;

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

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的全部争论。那个Common不支持直接将东西作为exports变量返回吗?
乔治·莫尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.