2013-10-08 47 views
1

在节点,我可以通过设置exports对象的属性定义像这样的模块:是否可以在打字稿中使用nodejs样式模块?

module.js

exports.fun = function (val) { 
    console.log(val); 
}; 

和要求它使用在var module = require('module')和使用module.fun()功能。

是否有可能定义模块中的打字稿这样的:

module.ts

exports.fun = function (val :string) { 
    console.log(val); 
}; 

,然后使用节点的语法,比如导入模块中的一些其他的文件,所以import module = require('module.ts')它编译为nodejs,但是,如果现在我在某些.ts文件中使用module.fun(),如果参数与module.ts文件中指定的类型不匹配,它应该给我一个错误。


我该如何在手稿中做到这一点?

+0

Typescript只是编译为JavaScript。它不会像模块那样添加任何功能,因为它不是库本身。您需要查看一个AMD库以允许使用类似的语法(https://github.com/amdjs/amdjs-api/wiki/AMD) – WiredPrairie

+0

以下是一个视频演示:http://www.youtube .com/watch?v = KDrWLMUY0R0&hd = 1&t = 7m20s – basarat

+0

@basarat我确实遇到过那个视频。我在说,在nodejs模块中,我将属性赋给'exports'.However,如果我在'.ts'文件中写'exports.num = 10',我得到'错误TS2071:无法解析外部模块' '。/ myModule'''和'错误TS2072:模块不能被别名为非模块类型。'因此,是否有可能使用JS语法,因为有效的JS应该是有效的TS? – Jatin

回答

1

你基本上描述了TypeScript中的外部模块如何工作。

例如:

Animals.ts

export class Animal { 
    constructor(public name: string) { } 
} 

export function somethingElse() { /* etc */ } 

Zoo.ts

import a = require('./Animals'); 
var lion = new a.Animal('Lion'); // Typechecked 
console.log(lion.name); 

编译与节点--module commonjs并运行zoo.js。

+0

是的,我想知道是否可以使用与nodejs相同的语法,即将属性分配给'exports'对象。那可能吗? – Jatin

+0

你是否按照他的说法编译并运行?因为它完全符合你的要求......只是尝试一下。 – Jake

+0

您可以手动分配到'exports'对象,但这正是编译器为您发出的内容。在TypeScript中使用内置的模块系统可以让您在使用导出的成员时保持类型安全。你看过这个例子中生成的代码吗? –

1

是的,可以使用真正的js语法。您正在使用关键字import,因为您希望导入的文件使用export关键字,所以您收到此错误。如果您想要使用js exports.foo语法,则应该使用var而不是导入。以下将编译/工作得很好:

var module = require('module.ts') 
+0

假设我将'module.ts'导出到'main.ts'中,然后编译'main.ts'不会编译'module.ts',并且如果对函数的不同参数进行了修改,它不会给出任何错误在module.ts中定义的main.ts中。 此外,编译后的js文件包含'require('module.ts')',我想这不应该是这种方式。 – Jatin