2013-10-08 61 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