2012-10-19 9 views
8

Se faccio riferimento a un file di dichiarazioni TypeScript (ad es. Jquery.d.ts) utilizzando la sintassi /// <reference path="..."/>, spetta a me accertarmi di caricare la libreria corrispondente con altri mezzi Ad esempio, solo il riferimento al file .d.ts non carica la libreria.Usa import/require in TypeScript per ottenere le dichiarazioni di interfaccia

C'è un modo per rendere dattiloscritto generare una chiamata require() per la libreria quando lo uso? Se non stavo usando AMD/requirejs potrei semplicemente chiamare require manualmente, ma mi piacerebbe farlo funzionare con AMD.

Il vantaggio di questo è che le mie dipendenze non sarebbero definite in due punti. Fare riferimento alla libreria da un file .ts sarebbe sufficiente per assicurarsi che venga caricata, piuttosto che dover mantenere manualmente l'elenco delle dipendenze nel mio HTML.

Aggiornamento: Ho aperto uno new question che chiarisce la mia situazione esatta. Voglio dare credito per la risposta alla mia domanda iniziale poiché non ho fornito tutti i dettagli necessari.

risposta

6

Sì, dattiloscritto supporta moduli "esterne", che sono fondamentalmente di prima classe AMD o CommonJS moduli. Ad esempio:

MyLib.ts

export function foo() { return 'bar' } 

MyProj.ts

import lib = module('./MyLib.ts') 
lib.foo(); // returns bar 

compilare questo con "AMD --module" e si otterrà il modulo corretto e richiedono la sintassi generata per voi .

+1

Moduli grande lavoro per le librerie che forniscono funzioni e variabili direttamente, ma ho bisogno di qualcosa di simile per le librerie che estendono le funzionalità esistenti come plugin jQuery. Non c'è nulla da esportare in questi, ma il loro caricamento aggiunge chiamate aggiuntive all'interfaccia JQuery (definita in jquery.d.ts) – dcstraw

+0

In tutta onestà, penso che la tua risposta si applichi alla mia domanda originale. Ho appena omesso di specificare completamente la mia domanda. Segnalo come risposta e porrò una domanda più chiara. – dcstraw

1

ho scritto something su questo sul mio blog. È inoltre possibile trovare un esempio su GitHub.

La soluzione è piuttosto lungo da spiegare, ma in fondo io uso spessori con Require.JS per definire un nome del modulo che rappresenta la libreria Javascript voglio caricare. Creo quindi un file TypeScript con lo stesso nome per fare in modo che il compilatore TypeScript generi codice Javascript che possa utilizzare la libreria JS che desidero. Non ha proprio senso, ma per favore leggi il post e penso che avrà più senso.

+0

Grazie per la risposta. Comunque non penso che questo risolva il mio problema. Questa soluzione presuppone ancora che la libreria abbia almeno una chiamata di livello superiore in modo che TypeScript generi la dipendenza nella chiamata 'define'. Non ho metodi o variabili di livello superiore poiché queste librerie sono plugin che estendono funzionalità esistenti. Inoltre, non penso che sia davvero necessario utilizzare gli shim nell'esempio. Se si crea un underscore.d.ts vicino a underscore.js, è possibile importare il modulo 'libs/underscore' e TypeScript userà il file .d.ts. – dcstraw

+0

Il file d.ts viene utilizzato solo da Typescript per determinare se il codice è stato digitato correttamente. Fondamentalmente è solo un'interfaccia, quindi nessun codice viene generato dal compilatore Typescript. È necessario fornire l'implementazione della libreria Javascript in qualche modo. Una soluzione è fare riferimento a un file Javascript nell'html come non si vuole fare. Un'altra soluzione è usare AMD per caricarlo in modo asincrono. Questa è la soluzione che propongo. – Absolom

+0

Capito, ma continuo a pensare che la soluzione sia inutilmente complessa a causa degli spessori. – dcstraw

Problemi correlati