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