2012-11-05 57 views
6

當涉及到以純Javascript編寫的聲明文件和第三方庫時,我沒有在TypeScript中獲得這些東西。比方說,我有以下的Javascript類:如何在TypeScript中使用聲明文件

$ cat SomeClass.js 

var SomeClass = (function() { 
    function SomeClass() { 
    } 
    SomeClass.prototype.method1 = function() { 
      return "some string"; 
    }; 
    return SomeClass; 
})(); 
exports.SomeClass = SomeClass; 

而且我想要得到它的類型檢查,所以我創建聲明文件是這樣的:

$ cat test.d.ts 

class SomeClass { 
    public method1(): string; 
} 

然後我想使用的類和聲明文件中的某些代碼:

$ cat main.ts 

///<reference path="./test.d.ts"/> 
import ns = module("./SomeClass"); 

function test(): string { 
    var sc = new ns.SomeClass(); 
    return sc.method1(); 
} 

當我嘗試編譯它,我得到這個:

$ tsc main.ts 
main.ts(2,19): The name '"./SomeClass"' does not exist in the current scope 
main.ts(2,19): A module cannot be aliased to a non-module type 
main.ts(5,16): Expected var, class, interface, or module 

從我所知道的情況來看,導入語句需要一個實際的TypeScript類來存在,並且引用語句不足以幫助編譯器找出如何處理它。

我試圖將其更改爲

import ns = module("./test.d"); 

但沒有骰子無論是。

唯一的辦法我能得到這個實際編譯和運行是使用要求語句,而不是進口的,就像這樣:

$ cat main.ts 

///<reference path="./node.d.ts"/> 
///<reference path="./test.d.ts"/> 
var ns = require("./SomeClass"); 

function test(): string { 
    var sc = new ns.SomeClass(); 
    return sc.method1(); 
} 

這段代碼的問題是,打字稿沒有運行任何類型檢查。事實上,我可以完全刪除線

///<reference path="./test.d.ts"/> 

它並沒有改變任何東西。但是,如果我刪除require語句,我可以進行類型檢查,但是由於沒有require語句,因此代碼在運行時崩潰。

$ cat main.ts 

///<reference path="./test.d.ts"/> 

function test(): string { 
    var sc = new SomeClass(); 
    return sc.method1(); 
} 

test(); 

$ node main.js 

main.js:2 
    var sc = new SomeClass(); 
       ^
ReferenceError: SomeClass is not defined 
    ... 

回答

7

貓test.d.ts

declare module "SomeClass.js" { 
    class SomeClass { 
     method1(): string; 
    } 
} 

貓Main.ts

///<reference path="test.d.ts"/> 
import ns = module("SomeClass.js"); 

function test() { 
    var sc = new ns.SomeClass(); 
    return sc.method1(); 
} 

TSC Main.ts --declarations

貓Main.js

var ns = require("SomeClass.js") 
function test() { 
    var sc = new ns.SomeClass(); 
    return sc.method1(); 
} 

貓Main.d.ts

import ns = module ("SomeClass.js"); 
function test(): string; 
相關問題