Comment utiliser une bibliothèque externe non-typescript à partir de typescript sans.d.ts?

je les ai définis dans mon.fichier html:

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

puis en essai.js:

 var myTree = Tree.tree({})

mais faute de frappe en disant: "impossible de trouver le nom 'Tree' "

j'ai aussi essayé de compiler avec --module amd et placer import Tree = require("model/tree"); en haut de l'essai.fichier js, mais il se trompe à nouveau: Cannot find external module 'model/tree'. cependant clairement il devrait être une importation valide, voir ici où il a été défini: https://github.com/marmelab/tree.js/blob/master/src/main.js

je ne pas envie d'écrire .D. ts pour chaque fichier javascript externe que je veux utiliser, Est-ce vraiment ce que Typescript veut que je fasse?

83
demandé sur rtorres 2014-12-11 10:02:30

2 réponses

je ne veux pas écrire .D. ts pour chaque fichier javascript externe que je veux utiliser, Est-ce vraiment ce que Typescript veut que je fasse?

Pas de. La solution la plus simple et la plus rapide consiste simplement à lui dire qu'il existe une variable Tree . C'est aussi simple que:

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

la sécurité des caractères est une échelle mobile en caractères typographiques. Dans ce cas, vous ne racontant le compilateur qu'il est quelque chose appelé Tree que vous gérerez et ne vous souciez pas beaucoup de la sécurité des caractères au-delà du fait que il est là .

plus ""

IMHO: la ligne declare var Tree:any; est une syntaxe beaucoup plus simple que d'autres outils de véficiation JS vous auraient écrit pour déclarer votre usage de variables qui ne sont pas présentes dans votre code.

mise à Jour

interface ITree {
    .. further methods and properties...
}

interface ITreeFactory {
    tree(input: { [key: string]: any }): Itree
};

declare var Tree: ITreeFactory; // magic...
108
répondu basarat 2018-07-03 06:15:32

vous pouvez définir 'require' vous-même et utiliser la fonctionnalité de dépendance amd non documentée de TypeScript:

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

'AMD-dependency' directive va dire au compilateur d'inclure votre module pour "définir" les arguments dans le code généré: voir un échantillon ici .

vous pouvez aussi vérifier un très bon article qui explique comment utiliser le typographie avec Requerjs.

mais notez que si vous n'écrivez pas les définitions dactylographiées appropriées pour votre code existant, vous ne recevrez aucune information sur les types, et vous n'obtiendrez donc pas de vérifications de sécurité des types, d'achèvement de code avancé dans les outils, etc. Donc, votre 'Tree' sera en fait de type 'any', et sera en fait une pièce js dynamique à l'intérieur d'autres codes TS.

21
répondu Anton 2014-12-11 09:52:50