Sto usando un sacco di librerie sia il mio partito proprio e 3 °. Vedo la directory tipizzazioni contiene alcuni per jQuery e WinRT ... ma come sono creato?
Come si fa a produrre un .d.ts "tipizzazioni" file di definizione di una libreria JavaScript esistente?
fonte dall'utente Hotrodmonkey
In altre lingue...
Ci sono alcune opzioni disponibili per voi a seconda della libreria in questione, come è scritto, e quale livello di accuratezza che stai cercando. Rivediamo le opzioni, in ordine più o meno di desiderabilità decrescente.
Forse esiste già
Controllare sempre DefinitelyTyped ( https://github.com/DefinitelyTyped/DefinitelyTyped ) prima. Si tratta di un pronti contro termine comunità piena di letteralmente migliaia di file .d.ts ed è molto probabile che la cosa si sta utilizzando è già lì. Si dovrebbe anche controllare TypeSearch ( https://microsoft.github.io/TypeSearch/ ), che è un motore di ricerca per i file .d.ts NPM-pubblicato; questo avrà un po 'più definizioni di DefinitelyTyped. Alcuni moduli sono anche la spedizione le proprie definizioni, come parte della loro distribuzione NPM, quindi anche vedere se questo è il caso prima di provare a scrivere il proprio.
Forse non avete bisogno di un
Dattiloscritto ora supporta la --allowJsbandiera e renderà più inferenze JS-based in file .js. Si può provare tra cui il file .js nella compilation insieme con --allowJsl'impostazione per vedere se questo ti dà una buona informazione di tipo abbastanza. Dattiloscritto riconoscerà le cose come le classi in stile ES5 e commenti JSDoc in questi file, ma può ottenere lo sgambetto se la libreria si inizializza in un modo strano.
Inizia con --allowJs
Se --allowJsti ha dato risultati decenti e si vuole scrivere un file di definizione di meglio te stesso, è possibile combinare --allowJscon --declarationa vedere "ipotesi migliore" del dattiloscritto ai tipi di biblioteca. Questo vi darà un punto di partenza decente, e può essere buono come un file scritto a mano se i commenti JSDoc sono ben scritti e il compilatore è stato in grado di trovarli.
Introduzione a dts-gen
Se --allowJsnon ha funzionato, si potrebbe desiderare di utilizzare dts-gen ( https://github.com/Microsoft/dts-gen ) per ottenere un punto di partenza. Questo strumento utilizza la forma di esecuzione dell'oggetto da elencare con precisione tutte le proprietà disponibili. Sul lato positivo questo tende ad essere molto preciso, ma lo strumento non supporta ancora raschiando i commenti JSDoc per popolare altri tipi. Si esegue questo modo:
npm install -g dts-gen
dts-gen -m <your-module>
Questo genererà your-module.d.tsnella cartella corrente.
Premi il pulsante Snooze
Se si desidera solo per fare tutto in seguito e venire senza i tipi per un po ', a macchina 2.0 è ora possibile scrivere
declare module "foo";
che vi permetterà importdel "foo"modulo con tipo any. Se è stato un mondiale che si vogliono trattare con più tardi, basta scrivere
declare const foo: any;
che vi darà una foovariabile.
È possibile utilizzare tsc --declaration fileName.tscome Ryan descrive, oppure è possibile specificare declaration: truesotto compilerOptionsnel vostro tsconfig.jsonsupponendo che hai già avuto un tsconfig.jsonsotto il vostro progetto.
Il modo migliore per affrontare questo (se un file dichiarazione non è accessibile DefinitelyTyped ) è quello di scrivere le dichiarazioni solo per le cose che si utilizza, piuttosto che l'intera libreria. Questo riduce il lavoro molto - e inoltre il compilatore è lì per dare una mano da lamentarsi metodi mancanti.
Come dice Ryan, il compilatore TSC ha un interruttore --declarationche genera un .d.tsfile da un .tsfile. Si noti inoltre che (i bug di blocco) dattiloscritto si suppone che sia in grado di compilare Javascript, in modo da poter passare codice javascript al compilatore TSC esistente.
come descritto nella http://channel9.msdn.com/posts/Anders-Hejlsberg-Steve-Lucco-and-Luke-Hoban-Inside-TypeScript a 00:33:52 avevano costruito uno strumento per convertire WebIDL e metadati in WinRT d.tS dattiloscritto
Ecco alcuni PowerShell che crea un unico file di definizione typescript una libreria che include più *.jsfile con JavaScript moderno.
In primo luogo, modificare tutte le estensioni .ts.
Get-ChildItem | foreach { Rename-Item $_ $_.Name.Replace(".js", ".ts") }
In secondo luogo, utilizzare il compilatore dattiloscritto per generare file di definizione. Ci sarà un sacco di errori di compilazione, ma possiamo ignorare quelli.
Get-ChildItem | foreach { tsc $_.Name }
Infine, combinare tutti i *.d.tsfile in un unico index.d.ts, rimuovendo le importdichiarazioni e rimuovendo la defaultdi ogni 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 finisce con un unico, utilizzabile index.d.tsfile che include molte delle definizioni.
Vorrei cercare un mapping esistente delle librerie JS 3 parti che supportano Script # o SharpKit. Gli utenti di questi C # per .js compilatori cross avranno affrontato il problema che ora faccia e potrebbero hanno pubblicato un programma open source per la scansione del 3 ° lib partito e convertire in scheletro classi C #. Se è così incidere il programma dello scanner per generare dattiloscritto al posto di C #.
In mancanza di ciò, traducendo un'interfaccia pubblica C # per il 3 ° lib parti in definizioni dattiloscritto potrebbe essere più semplice di fare lo stesso con la lettura della sorgente JavaScript.
Il mio particolare interesse è quadro ExtJS RIA di Sencha e so che ci sono stati progetti pubblicati per generare un C # interpretazione per Script # o SharpKit
Quando si crea una propria libreria, è possibile creare *.d.tsfile utilizzando il tsccomando di (dattiloscritto Compiler) in questo modo: (supponendo che si sta costruendo la tua libreria alla dist/libcartella)
tsc -d --declarationDir dist/lib --declarationMap --emitDeclarationOnly
-d(--declaration): Genera i*.d.tsfile--declarationDir dist/lib: Directory di output per i file di dichiarazione generati.--declarationMap: Genera un Sourcemap per ogni file corrispondente' .d.ts'.--emitDeclarationOnly: Solo emettere file di dichiarazione' .d.ts'. (Senza JS compilato)
(vedere i documenti per tutte le opzioni della riga di comando del compilatore)
O per esempio nella vostra package.json:
"scripts": {
"build:types": "tsc -d --declarationDir dist/lib --declarationMap --emitDeclarationOnly",
}
e quindi eseguire: yarn build:types(o npm run build:types)