2012-11-05 8 views
6

C'è qualcosa che non ottengo in TypeScript quando si tratta di file di dichiarazione e librerie di terze parti scritte in puro Javascript. Diciamo che ho la seguente classe Javascript:Come utilizzare i file di dichiarazione in TypeScript

$ cat SomeClass.js 

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

E voglio ottenere tipo di controllo per esso, quindi creo file di dichiarazione come questa:

$ cat test.d.ts 

class SomeClass { 
    public method1(): string; 
} 

Poi voglio utilizzare la classe e la dichiarazione depositare in qualche codice:

$ cat main.ts 

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

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

Quando provo a compilare, ottengo questo:

$ 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 

Da quello che posso dire, l'istruzione import richiede una classe TypeScript effettiva e l'istruzione di riferimento non è sufficiente per aiutare il compilatore a capire come gestirlo.

Ho provato a cambiare a

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

Ma niente da fare neanche.

L'unico modo in cui posso ottenere questo per compilare realtà e correre è quello di utilizzare l'istruzione richiedono invece di importazione, in questo modo:

$ 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(); 
} 

Il problema con questo codice è che dattiloscritto non è in esecuzione alcun tipo di controllo . In effetti, posso rimuovere completamente la linea

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

e non cambia nulla.

Tuttavia, se rimuovo l'istruzione require, posso ottenere il controllo del tipo, ma il codice esplode in fase di esecuzione perché non è richiesta alcuna istruzione.

$ 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 
    ... 

risposta

7

gatto test.d.ts

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

gatto 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

gatto main.js

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

gatto Main.d.ts

import ns = module ("SomeClass.js"); 
function test(): string; 
Problemi correlati