打字稿中的 module.exports

Posted

技术标签:

【中文标题】打字稿中的 module.exports【英文标题】:module.exports in typescript 【发布时间】:2012-09-23 15:46:51 【问题描述】:

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

【问题讨论】:

【参考方案1】:

您可以像这样在 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 没有实现 export Person ... bla bla bla ?我认为这是合乎逻辑的,不是吗?还是我错过了什么? 是否还可以从文件中导出一些类型?您可能希望从文件中获取类型以编写测试,但最后仍需要 module.exports【参考方案2】:

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

【讨论】:

为了澄清(因为我不得不去挖掘这个),0.9 中的语法可以在这里找到:blogs.msdn.com/b/typescript/archive/2013/06/18/…(在“Export =”下)。 为了进一步澄清,对于未来的读者,它已经完全按照提问者的要求实现了几乎。 . . 但我真正想要的是 export = Greeter;,这正是你所做的:) 我只想从config/db.ts 公开一个配置对象并在 app.xml 中使用该配置。这就是我在 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);【参考方案3】:

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

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

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

(module).exports = MyClass;

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

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

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

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

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

【讨论】:

【参考方案4】:

这很丑陋,但你仍然可以这样做:

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

编译成:

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

【讨论】:

不幸的是,TypeScript 编译器似乎不能很好地处理这个问题。例如,当你这样做时,你不能从类派生。 这将如何工作?这不是 CommonJs 与 AMD 的全部争论。那个 Common 不支持直接作为 export 变量返回东西?

以上是关于打字稿中的 module.exports的主要内容,如果未能解决你的问题,请参考以下文章

打字稿中的通用对象类型

打字稿中的Nodejs需要('this')(that)

打字稿中的数组

对象打字稿中的条件类型

打字稿中的“三个点”是啥意思?

扩展打字稿中的快速请求类型