【问题标题】:module.exports in typescript打字稿中的 module.exports
【发布时间】: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 可以做到这一点吗?

【问题讨论】:

    标签: typescript import commonjs


    【解决方案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 变量返回东西?
      猜你喜欢
      • 2016-11-19
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 2021-07-02
      • 1970-01-01
      • 1970-01-01
      • 2017-05-25
      • 1970-01-01
      相关资源
      最近更新 更多