Eu folosesc o mulțime de biblioteci proprie și a treia mea petrecere. Văd „typings“ directorul conține unele pentru Jquery și WinRT ... dar cum sunt ele create?
Cum produci un .d.ts „typings“ fișier definiție dintr-o bibliotecă JavaScript existente?
sursa de către utilizator Hotrodmonkey
În alte limbi...
Există câteva opțiuni disponibile pentru tine, în funcție de biblioteca în cauză, cum este scris, și nivelul de precizie pe care o căutați. Să trecem în revistă opțiunile, în aproximativ ordinea descrescătoare dezirabilitate.
Poate există deja
Verificați întotdeauna DefinitelyTyped ( https://github.com/DefinitelyTyped/DefinitelyTyped ) mai întâi. Aceasta este o comunitate repo plină de literalmente mii de fișiere .d.ts și este foarte probabil ca lucrul pe care îl utilizați este deja acolo. De asemenea , verificați TypeSearch ( https://microsoft.github.io/TypeSearch/ ) , care este un motor de căutare pentru fișierele .d.ts publicate-NPM; acest lucru va avea ceva mai multe definiții decât DefinitelyTyped. Câteva module sunt , de asemenea , de transport maritim propriile definiții , ca parte a distribuției lor NPM, așa că , de asemenea , a se vedea dacă este cazul înainte de a încerca să scrie opinia ta.
Poate că nu aveți nevoie de unul
Typescript acceptă acum --allowJspavilion și va face mai multe deducții JS bazate în fișiere Js. Puteți încerca , inclusiv fișierul js în compilarea dumneavoastră , împreună cu --allowJssetarea pentru a vedea dacă acest lucru vă oferă informații de tip bun suficient. Typescript va recunoaște lucruri , cum ar fi clasele ES5-stil și comentarii JSDoc în aceste fișiere, dar se poate obține în cazul în care se repede la biblioteca în sine inițializează într - un mod ciudat.
Începeți cu --allowJs
Dacă --allowJsți -a dat rezultate decente și doriți să scrieți fișierul o definiție mai bună le puteți combina --allowJscu --declarationpentru a vedea „cea mai probabilă“ typescript, la tipurile de bibliotecă. Acest lucru vă va da un punct de plecare decent, și poate fi la fel de bun ca un fișier autor mână în cazul în care observațiile JSDoc sunt bine scrise , iar compilatorul a fost capabil să le găsească.
Începeți cu dts-gen
În cazul în care --allowJsnu a funcționat, ați putea dori să utilizați dts-gen ( https://github.com/Microsoft/dts-gen ) pentru a obține un punct de plecare. Acest instrument utilizează forma de execuție a obiectului pentru a enumera cu exactitate toate proprietățile disponibile. Pe partea de plus acest lucru tinde să fie foarte precise, dar instrumentul nu acceptă încă decopertarea comentariile JSDoc pentru a popula tipuri suplimentare. Executați acest lucru astfel:
npm install -g dts-gen
dts-gen -m <your-module>
Acest lucru va genera your-module.d.tsîn dosarul curent.
Atipi
Dacă doriți doar să-l facă tot mai târziu și du-te fără tipuri pentru un timp, dactilografiat 2.0 puteți scrie acum
declare module "foo";
care vă va permite modulul cu tipul . Dacă aveți un nivel global pe care doriți să se ocupe de mai târziu, trebuie doar să scrieimport"foo"any
declare const foo: any;
care vă va oferi o foovariabilă.
Puteți folosi fie tsc --declaration fileName.tsca Ryan descrie, sau puteți specifica declaration: truesub compilerOptionsîn dumneavoastră tsconfig.jsonpresupunând că ați avut deja un tsconfig.jsonsub proiect.
Cel mai bun mod de a face cu acest lucru ( în cazul în care un fișier declarație nu este disponibil pe DefinitelyTyped ) este de a scrie declarații numai pentru lucrurile pe care le utilizați , mai degrabă decât întreaga bibliotecă. Aceasta reduce activitatea mult - și , în plus compilator este acolo pentru a ajuta plângându despre metodele care lipsesc.
După cum spune Ryan, compilatorul TSC are un comutator --declarationcare generează un .d.tsfișier dintr - un .tsfișier. De asemenea , rețineți că (bug - uri de restrictionare) typescript ar trebui să fie capabil de a compila Javascript, astfel încât să puteți trece de cod JavaScript compilator TSC existent.
așa cum este descris în http://channel9.msdn.com/posts/Anders-Hejlsberg-Steve-Lucco-and-Luke-Hoban-Inside-TypeScript la 0:33:52 au construit un instrument pentru a converti WebIDL și WinRT metadate în d.ts typescript
Iată câteva PowerShell care creează un singur fișier de definire a typescript o bibliotecă care include mai multe *.jsfișiere cu JavaScript moderne.
În primul rând, schimba toate extensiile .ts.
Get-ChildItem | foreach { Rename-Item $_ $_.Name.Replace(".js", ".ts") }
În al doilea rând, utilizați compilatorul typescript pentru a genera fișierele de definiție. Vor fi o grămadă de erori de compilare, dar putem ignora pe cei.
Get-ChildItem | foreach { tsc $_.Name }
În cele din urmă, se combină toate *.d.tsfișierele într - o singură index.d.ts, eliminarea importdeclarațiilor și îndepărtând defaultdin fiecare declarație de export.
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 $_ }
Acest lucru se termină cu un singur, ușor de utilizat index.d.tsfișier care include multe dintre definițiile.
Aș căuta o cartografiere existentă a treia parte dvs. JS biblioteci care acceptă script # sau SharpKit. Utilizatorii acestor C # pentru a js compilatoare cruce va fi confruntat cu problema cu care vă confruntați acum și ar putea fi publicat un program open source pentru a scana treia lib petrecere și converti în scheletul C # clase. Dacă da hack programul de scanare pentru a genera typescript în loc de C #.
În caz contrar, traducerea o interfață C # publice pentru a 3-lib dumneavoastră în parte definiții typescript ar putea fi mai simplă decât a face același lucru citind sursa JavaScript.
Interesul meu special este cadru ExtJS RIA Sencha lui și știu că au fost publicate proiecte pentru a genera o C # interpretare pentru Script # sau SharpKit
Când creați propria bibliotecă, puteți puteți crea *.d.tsfișiere utilizând tsccomanda (typescript Compiler) astfel: (presupunând că sunteți construirea biblioteca la dist/libdosar)
tsc -d --declarationDir dist/lib --declarationMap --emitDeclarationOnly
-d(--declaration): Generează*.d.tsfișierele--declarationDir dist/libDirectorul de ieșire pentru fișiere cu declarații generate.--declarationMap: Generează un sourcemap pentru fiecare fișier corespunzător“.d.ts'.--emitDeclarationOnly: Emit numai fișiere cu declarații“.d.ts'. (Nu JS compilat)
( a se vedea docs pentru toate opțiunile de linie de comandă compilator)
Sau , de exemplu , în dumneavoastră package.json:
"scripts": {
"build:types": "tsc -d --declarationDir dist/lib --declarationMap --emitDeclarationOnly",
}
și apoi executați: yarn build:types(sau npm run build:types)