Come si produce un file di definizione “tipizzazioni” .dts da una libreria JavaScript esistente?

Sto usando molte librerie sia mie che di terze parti. Vedo che la directory “typings” ne contiene alcuni per Jquery e WinRT … ma come vengono creati?

Esistono alcune opzioni disponibili a seconda della libreria in questione, del modo in cui è stata scritta e del livello di precisione che stai cercando. Rivediamo le opzioni, in ordine di appetibilità più o meno decrescente.

Forse esiste già

Controlla sempre DefinitelyTyped ( https://github.com/DefinitelyTyped/DefinitelyTyped ) prima. Questo è un repository di comunità pieno di migliaia di file .d.ts ed è molto probabile che la cosa che stai usando sia già lì. Dovresti anche controllare TypeSearch ( https://microsoft.github.io/TypeSearch/ ) che è un motore di ricerca per i file .d.ts pubblicati da NPM; questo avrà un po ‘più di definizioni di DefinitelyTyped. Alcuni moduli stanno anche spedendo le loro definizioni come parte della loro distribuzione NPM, quindi vedi anche se questo è il caso prima di provare a scriverne uno tuo.

Forse non ne hai bisogno

TypeScript ora supporta il flag --allowJs e creerà ulteriori inferenze basate su JS nei file .js. Puoi provare a includere il file .js nella compilation insieme all’impostazione --allowJs per vedere se questo ti dà abbastanza informazioni sul tipo. TypeScript riconoscerà cose come le classi in stile ES5 ei commenti JSDoc in questi file, ma potrebbe essere bloccato se la libreria si inizializza in modo strano.

Inizia con --allowJs

Se --allowJs ti dà risultati decenti e vuoi scrivere tu stesso un file di definizione migliore, puoi combinare --allowJs con --declaration per vedere “best guess” di TypeScript nei tipi della libreria. Questo ti darà un buon punto di partenza, e potrebbe essere buono come un file scritto a mano se i commenti JSDoc sono ben scritti e il compilatore è stato in grado di trovarli.

Inizia con dts-gen

Se --allowJs non ha funzionato, potresti usare dts-gen ( https://github.com/Microsoft/dts-gen ) per ottenere un punto di partenza. Questo strumento utilizza la forma runtime dell’object per enumerare con precisione tutte le proprietà disponibili. Il lato positivo è che tende ad essere molto accurato, ma lo strumento non supporta ancora lo scraping dei commenti JSDoc per popolare altri tipi. Lo fai in questo modo:

 npm install -g dts-gen dts-gen -m  

Questo genererà il your-module.d.ts nella cartella corrente.

Premi il pulsante Snooze

Se si desidera eseguire tutto in un secondo momento e passare senza tipi per un po ‘, in TypeScript 2.0 è ora ansible scrivere

 declare module "foo"; 

che ti permetterà di import il modulo "foo" con il tipo any . Se hai un globale con cui vuoi confrontarti in seguito, scrivi

 declare const foo: any; 

che ti darà una variabile foo .

Puoi usare tsc --declaration fileName.ts come descritto da Ryan, oppure puoi specificare declaration: true in compilerOptions nel tuo tsconfig.json assumendo che tu abbia già avuto un tsconfig.json sotto il tuo progetto.

Il modo migliore per gestire questo problema (se un file di dichiarazione non è disponibile su DefinitelyTyped ) è scrivere dichiarazioni solo per le cose che si usano piuttosto che per l’intera libreria. Questo riduce il lavoro molto – e inoltre il compilatore è lì per dare una mano lamentandosi dei metodi mancanti.

Come dice Ryan, il compilatore --declaration ha una --declaration switch che genera un file .d.ts da un file .ts . Si noti inoltre che (errori di blocco) si suppone che TypeScript sia in grado di compilare Javascript, in modo da poter passare il codice javascript esistente al compilatore tsc.

come descritto in http://channel9.msdn.com/posts/Anders-Hejlsberg-Steve-Lucco-and-Luke-Hoban-Inside-TypeScript alle 00:33:52 avevano creato uno strumento per convertire i metadati WebIDL e WinRT in TypeScript d.ts

Vorrei cercare una mapping esistente delle librerie JS di terze parti che supportano Script # o SharpKit. Gli utenti di questi compilatori C # to .js avranno affrontato il problema che ora affronteranno e potrebbero aver pubblicato un programma open source per eseguire la scansione della lib di terze parti e convertirli in classi skeleton C #. Se è così, hackerare il programma dello scanner per generare TypeScript al posto di C #.

In caso contrario, la conversione di un’interfaccia pubblica C # per la libreria di terze parti in definizioni TypeScript potrebbe essere più semplice rispetto a fare la stessa leggendo il codice JavaScript sorgente.

Il mio interesse speciale è il framework RIA ExtJS di Sencha e so che ci sono stati progetti pubblicati per generare un’interpretazione C # per Script # o SharpKit

Ecco alcuni PowerShell che crea un singolo file di definizione TypeScript una libreria che include più file *.js con JavaScript moderno.

Innanzitutto, modifica tutte le estensioni in .ts .

 Get-ChildItem | foreach { Rename-Item $_ $_.Name.Replace(".js", ".ts") } 

In secondo luogo, utilizzare il compilatore TypeScript per generare file di definizione. Ci saranno un sacco di errori del compilatore, ma possiamo ignorarli.

 Get-ChildItem | foreach { tsc $_.Name } 

Infine, *.d.ts tutti i file *.d.ts in un index.d.ts , rimuovendo le istruzioni di import e rimuovendo il default da ciascuna istruzione di esportazione.

 Remove-Item index.d.ts; Get-ChildItem -Path *.d.ts -Exclude "Index.d.ts" | ` foreach { Get-Content $_ } | ` where { !$_.ToString().StartsWith("import") } | ` foreach { $_.Replace("export default", "export") } | ` foreach { Add-Content index.d.ts $_ } 

Questo termina con un singolo file index.d.ts utilizzabile che include molte delle definizioni.