2014-12-11 7 views
73

ho definito questi nel mio file HTML:Come utilizzare una libreria esterna non dattiloscritta da dattiloscritto senza .d.ts?

<script type="text/javascript" src="bower_components/tree.js/tree.min.js"></script> 
<script type="text/javascript" src="bower_components/q/q.js"></script> 
<script type="text/javascript" src="test.js"></script> 

Poi nel test.js:

var myTree = Tree.tree({}) 

Ma gli errori tipografico fuori dicendo: "Impossibile trovare il nome di 'albero'"

Ho anche provato a compilare con --module amd e a collocare import Tree = require("model/tree"); nella parte superiore del file test.js, ma si verifica nuovamente errori: Cannot find external module 'model/tree'. tuttavia chiaramente dovrebbe essere un'importazione valida, vedere qui dove è stato definito: https://github.com/marmelab/tree.js/blob/master/src/main.js

io Non voglio scrivere .d.ts file per ogni singolo file JavaScript esterno che voglio usare, è che sul serio quello tipografico vuole che io faccia?

+1

Si ** non è necessario ** scrivere file .d.ts. Vedi http://stackoverflow.com/questions/27273489/why-doesnt-type-script-support-referencing-javascript-files per un esempio – xmojmr

+0

interessante, che comunque richiederebbe comunque la dichiarazione degli oggetti. Ho avuto l'impressione che Typescript fosse completamente compatibile con javascript. Immagino che abbia senso dal punto di vista di Typescript, in qualche modo ha bisogno di leggere il codice e se non avesse riferimenti bene, sarebbe errori. – Blub

risposta

98

Non voglio scrivere file .d.ts per ogni singolo file javascript esterno che voglio usare, è questo che il Typescript vuole che faccia?

No. La soluzione più semplice/rapida è semplicemente quella di indicare che esiste una variabile Tree. È semplice:

declare var Tree:any; // Magic 
var myTree = Tree.tree({}) 

TypeSafety è una scala scorrevole in TypeScript. In questo caso stai solo dicendo al compilatore che c'è qualcosa chiamato Tree che gestirai e non ti preoccupi di molta typesafety oltre al fatto che è .

Più

IMHO: La linea è declare var Tree:any; sintassi molto più semplice rispetto ad altri strumenti veficiation JS avrebbe si scrive di dichiarare l'uso di variabili che non sono presenti nel codice.

+1

hmm, questo non sembra funzionare con le importazioni anche se –

+0

In una parola, Magic – robbpriestley

+6

Quindi questo funziona con l'importazione? – chrismarx

19

È possibile definire 'require' se stessi e utilizzare la funzione AMD-dipendenza non documentata del dattiloscritto:

/// <amd-dependency path="model/tree" /> 
declare var require:(moduleId:string) => any; 
var Tree = require("model/tree"); 

'amd-dipendenza' direttiva dirà al compilatore di includere il modulo per "definire" argomenti a codice generato : see a sample here.

È inoltre possibile controllare a very good article che spiega come utilizzare TypeScript con RequireJS.

Ma si noti che senza scrivere le definizioni TypeScript corrette per il codice esistente non verranno fornite informazioni di tipo, quindi non si otterranno controlli di sicurezza del tipo, completamento avanzato del codice negli strumenti e così via. Quindi, il tuo 'Albero' sarà effettivamente di tipo 'qualsiasi', e in realtà sarà un pezzo JS dinamico all'interno di un altro codice TS.

+0

Ottima idea dichiarare 'require'. Grazie per questo!;) – Mark