Hvordan produsere en .d.ts "typings" definisjon fil fra en Javascript-bibliotek eksisterende?

stemmer
139

Jeg bruker mye av bibliotekene både min egen og tredje part. Jeg ser typings katalog inneholder noe for Jquery og WinRT ... men hvordan er de laget?

Publisert på 02/10/2012 klokken 09:29
kilden bruker
På andre språk...                            


8 svar

stemmer
177

Det finnes noen alternativer tilgjengelige for deg, avhengig av biblioteket i spørsmålet, hvordan den er skrevet, og hvilket nivå av nøyaktighet du leter etter. La oss se gjennom alternativene, i omtrent synkende ønskeligheten.

Kanskje den finnes allerede

Kontroller alltid DefinitelyTyped ( https://github.com/DefinitelyTyped/DefinitelyTyped ) først. Dette er et fellesskap repo full av tusenvis av .d.ts filer, og det er svært sannsynlig tingen du bruker er allerede der. Du bør også sjekke TypeSearch ( https://microsoft.github.io/TypeSearch/ ) som er en søkemotor for NPM-publisert .d.ts filer; dette vil ha litt flere definisjoner enn DefinitelyTyped. Noen moduler er også frakt sine egne definisjoner som en del av NPM distribusjon, så også se om det er tilfelle før du prøver å skrive din egen.

Kanskje du ikke trenger en

Loggfila støtter nå --allowJsflagget og vil gjøre flere JS-baserte slutninger i JS-filer. Du kan prøve inkludert JS-fil i din samling sammen med --allowJsfor å se om dette gir deg god nok typen informasjon. Loggfila vil gjenkjenne ting som ES5-stil klasser og JSDoc kommentarer i disse filene, men kan bli utløst opp hvis biblioteket initialiserer seg selv på en merkelig måte.

Kom i gang med --allowJs

Hvis --allowJsga deg anstendig resultat, og du ønsker å skrive en bedre definisjon fil selv, kan du kombinere --allowJsmed --declarationå se Loggfila er "best guess" på hvilke typer biblioteket. Dette vil gi deg en anstendig utgangspunkt, og kan være like god som en hånd-skrevet-fil hvis JSDoc kommentarer er velskrevet og kompilatoren var i stand til å finne dem.

Kom i gang med dts-gen

Hvis --allowJsikke fungerte, kan det være lurt å bruke DTS-gen ( https://github.com/Microsoft/dts-gen ) for å få et utgangspunkt. Dette verktøyet bruker kjøretids formen av gjenstanden for nøyaktig å regne opp alle tilgjengelige egenskaper. På pluss-siden dette har en tendens til å være veldig nøyaktig, men verktøyet støtter ennå ikke skrape JSDoc kommentarer å fylle flere typer. Du kjører dette slik:

npm install -g dts-gen
dts-gen -m <your-module>

Dette vil generere your-module.d.tsi gjeldende mappe.

Hit på snooze-knappen

Hvis du bare ønsker å gjøre alt senere og gå uten typer for en stund, i Loggfila 2.0 kan du nå skrive

declare module "foo";

som vil la deg importden "foo"modulen med type any. Hvis du har et globalt du ønsker å håndtere senere, bare skrive

declare const foo: any;

som vil gi deg en foovariabel.

Svarte 02/10/2012 kl. 17:11
kilden bruker

stemmer
29

Du kan enten bruke tsc --declaration fileName.tssom Ryan beskriver, eller du kan spesifisere declaration: trueetter compilerOptionsi ditt tsconfig.jsonforutsatt at du allerede har hatt en tsconfig.jsoni henhold til prosjektet.

Svarte 04/08/2016 kl. 00:54
kilden bruker

stemmer
14

Den beste måten å håndtere dette (hvis en erklæring filen ikke er tilgjengelig på DefinitelyTyped ) er å skrive erklæringer bare for de tingene du bruker i stedet for hele biblioteket. Dette reduserer arbeidet mye - og i tillegg kompilatoren er der for å hjelpe ut av klager om manglende metoder.

Svarte 19/10/2015 kl. 09:08
kilden bruker

stemmer
11

Som Ryan sier, har TSC kompilatoren en bryter --declarationsom genererer en .d.tsfil fra en .tsfil. Vær også oppmerksom på at (sperring bugs) Loggfila er ment å være i stand til å kompilere Javascript, slik at du kan passere eksisterende javascript-kode til TSC kompilatoren.

Svarte 02/10/2012 kl. 23:02
kilden bruker

stemmer
7

som beskrevet i http://channel9.msdn.com/posts/Anders-Hejlsberg-Steve-Lucco-and-Luke-Hoban-Inside-TypeScript på 00:33:52 de hadde bygget et verktøy for å konvertere WebIDL og WinRT metadata i Loggfila d.ts

Svarte 02/10/2012 kl. 20:24
kilden bruker

stemmer
2

Her er noen Powershell som skaper en enkelt Loggfila definisjonsfilen et bibliotek som inneholder flere *.jsfiler med moderne Javascript.

Først endre alle utvidelser til .ts.

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

For det andre bruker Loggfila kompilatoren å generere definisjonsfiler. Det vil være en haug med kompilatoren feil, men vi kan ignorere disse.

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

Til slutt, kombinere alle *.d.tsfiler til en index.d.ts, fjerne importuttalelser og fjerne defaultfra hvert eksport uttalelse.

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 $_ }

Det ender med et enkelt, brukervennlig index.d.tsfil som inneholder mange av definisjonene.

Svarte 19/08/2016 kl. 22:44
kilden bruker

stemmer
2

Jeg vil se på en eksisterende kartlegging av tredje parts JS biblioteker som støtter Script # eller SharpKit. Brukere av disse C # til JS kryss kompilatorer vil ha møtt problemet du nå står overfor, og kanskje har publisert en åpen kildekode-program for å skanne tredje part lib og konvertere til skjelettet C # klasser. Hvis så hacke skanneren program for å generere Loggfila i stedet for C #.

Sviktende at sette en C # felles grensesnitt for tredje part lib inn Loggfila definisjoner kan være enklere enn å gjøre det samme ved å lese kilden Javascript.

Min spesiell interesse er Sencha er ExtJS RIA rammeverk og jeg vet det har vært prosjekter publisert å generere en C # tolkning Script # eller SharpKit

Svarte 04/10/2012 kl. 17:37
kilden bruker

stemmer
0

Når du oppretter ditt eget bibliotek, kan du opprette *.d.tsfiler ved hjelp av tsc(Loggfila Compiler) kommandoen slik: (forutsatt at du bygge ditt bibliotek til dist/libmappe)

tsc -d --declarationDir dist/lib --declarationMap --emitDeclarationOnly
  • -d( --declaration): Genererer *.d.tsfiler
  • --declarationDir dist/libUtgang katalog for genererte erklæring filer.
  • --declarationMap: Genererer en sourcemap for hver tilsvarende' .d.ts' fil.
  • --emitDeclarationOnly: Bare avgir' .d.ts erklæring filer. (Ingen kompilert JS)

(se dokumenter for alle kommandolinje kompilatoren alternativene)

Eller for eksempel i package.json:

"scripts": {
    "build:types": "tsc -d --declarationDir dist/lib --declarationMap --emitDeclarationOnly",
}

og deretter kjøre: yarn build:types(eller npm run build:types)

Svarte 23/09/2019 kl. 19:24
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more