Ho un numero di plug-in jQuery che vorrei caricare utilizzando il pattern AMD in TypeScript. Ad esempio, potrei avere questa struttura:Caricamento asincrono di dichiarazioni TypeScript senza esportazioni
/lib/jquery.myplugin.js
/app.ts
Il plugin si estende semplicemente jQuery. Non fornisce nuove funzioni o variabili di primo livello. Un esempio potrebbe essere:
// jquery.myplugin.js
jQuery.fn.myExample = function() { ... }
Il file jquery.myplugin.d.ts corrispondente assomiglia:
interface JQuery {
myExample();
}
Così ora in app.ts posso chiamare qualcosa come $('#my-element').myExample()
. Si noti che questo presuppone che io abbia già caricato le dichiarazioni jquery.d.ts di Microsoft.
La mia domanda è: come caricare questa libreria in modo asincrono e sfruttare la digitazione statica TypeScripts? Potrei usare in questo modo:
/// <reference path="lib/jquery.myplugin.d.ts"/>
ma che mi richiede di aggiungere un tag <script>
al mio HTML, e la biblioteca non è caricato in modo asincrono. Voglio dattiloscritto per generare questo codice:
define(["require", "exports", "lib/jquery.myplugin"], function (require, exports, __jquery.myplugin__) {
...
// Use my plugin
$('#my-element').myExample();
}
Tuttavia, poiché non ci sono esportazioni nei .d.ts il file non posso scrivere import myplugin = module('lib/jquery.myplugin')
.
Il più vicino che ho ottenuto è di creare un jquery.myplugin.d.ts
che fa riferimento a un altro file ts con la dichiarazione dell'interfaccia e include almeno un'esportazione. Tuttavia non c'è nulla da esportare in questa libreria, e per ottenere l'output desiderato non devo solo aggiungere un'esportazione, ma devo chiamarlo.
Aggiornamento: Ho aperto un work item per questo su typescript.codeplex.com
mia soluzione attuale è quella di chiamare manualmente 'require ([...],() => {...}) 'nel mio codice TypeScript, che genera una chiamata richiesta nidificata. Lontano dall'ideale, ma funziona. – dcstraw