打字稿中的 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的主要内容,如果未能解决你的问题,请参考以下文章