Ik gebruik een veel bibliotheken zowel mijn eigen en 3rd party. Ik zie de directory typeringen bevat een aantal voor jQuery en WinRT ... maar hoe worden ze gemaakt?
Hoe maak je een .d.ts "typeringen" definitie-bestand van een bestaande JavaScript-bibliotheek te produceren?
bron van user Hotrodmonkey
In andere talen...
Er zijn een paar opties voor u beschikbaar, afhankelijk van de bibliotheek in kwestie, hoe het is geschreven, en welk niveau van nauwkeurigheid die u zoekt. Laten we kijken naar de opties, in ruwweg dalende volgorde van wenselijkheid.
Misschien is het bestaat al
Controleer altijd DefinitelyTyped ( https://github.com/DefinitelyTyped/DefinitelyTyped ) eerste. Dit is een community repo vol letterlijk duizenden .d.ts bestanden en het is zeer waarschijnlijk het ding die je gebruikt er al is. U moet ook controleren TypeSearch ( https://microsoft.github.io/TypeSearch/ ), dat is een zoekmachine voor NPM gepubliceerd .d.ts bestanden; dit zal iets meer definities dan DefinitelyTyped hebben. Een aantal modules zijn ook de scheepvaart hun eigen definities als onderdeel van hun NPM distributie, dus ook zien of dat het geval is voordat u uw eigen schrijven.
Misschien heb je niet een nodig
Typoscript ondersteunt nu de --allowJsvlag en zal meer JS-gebaseerde gevolgtrekkingen te maken in .js bestanden. U kunt proberen met inbegrip van de .js bestand in uw compilatie samen met de --allowJsinstelling om te zien of dit geeft je goed genoeg soort informatie. Typescript zal dingen zoals ES5-stijl klassen en JSDoc opmerkingen in deze bestanden te herkennen, maar kunnen krijgen gestruikeld als de bibliotheek zelf initieert op een vreemde manier.
De slag met --allowJs
Als --allowJsgaf je behoorlijke resultaten en u wilt schrijven een betere definitie bestand hebt, dan kun je combineren --allowJsmet --declarationaan typoscript van "best guess" zien aan het typen van de bibliotheek. Dit geeft je een fatsoenlijke uitgangspunt te geven, en kunnen net zo goed als een met de hand geschreven bestand zijn als de JSDoc opmerkingen zijn goed geschreven en de compiler in staat was om ze te vinden.
Aan de slag met dts-gen
Als --allowJsniet werkt, wil je misschien dts-gen (gebruik https://github.com/Microsoft/dts-gen ) om een startpunt te krijgen. Dit gebruikt de runtime vorm van het object nauwkeurig te sommen alle beschikbare eigenschappen. Aan de positieve kant neigt dit zeer nauwkeurig te zijn, maar de functie heeft nog geen ondersteuning voor het schrapen van de JSDoc opmerkingen tot andere soorten bevolken. U voert dit als volgt:
npm install -g dts-gen
dts-gen -m <your-module>
Dit zal genereren your-module.d.tsin de huidige map.
Druk op de Snooze Button
Als je gewoon wilt om alles te doen later en gaan zonder types voor een tijdje, in typemachineschrift 2.0 kunt u nu schrijven
declare module "foo";
die laat je importde "foo"module met type any. Als u een globale je wilt om te gaan met later, gewoon schrijven
declare const foo: any;
die geeft je een geven foovariabele.
U kunt gebruiken tsc --declaration fileName.tszoals Ryan beschrijft, of u kunt opgeven declaration: trueonder compilerOptionsin je tsconfig.jsonervan uitgaande dat je al hebt gehad een tsconfig.jsononder uw project.
De beste manier om te gaan met deze (als een verklaring bestand is niet beschikbaar op DefinitelyTyped ) is om verklaringen te schrijven alleen voor de dingen die je gebruiken in plaats van de gehele bibliotheek. Dit vermindert het werk een stuk - en bovendien de compiler is er om te helpen door te klagen over het missen van methoden.
Zoals Ryan zegt, de TSC compiler heeft een schakelaar --declarationdie een genereert .d.tsbestand van een .tsbestand. Merk ook op dat (behoudens bugs) Typescript wordt verondersteld om te kunnen Javascript compileren, zodat u kunt doorgeven bestaande JavaScript-code om de TSC-compiler.
zoals beschreven in http://channel9.msdn.com/posts/Anders-Hejlsberg-Steve-Lucco-and-Luke-Hoban-Inside-TypeScript op 00:33:52 hadden ze een middel om WebIDL en WinRT metadata omzetten in ingebouwd typoscript d.ts
Hier is een aantal PowerShell dat een enkel typoscript definitie bestand een bibliotheek die meerdere omvat creëert *.jsbestanden met moderne JavaScript.
Wijzig eerst alle uitbreidingen aan .ts.
Get-ChildItem | foreach { Rename-Item $_ $_.Name.Replace(".js", ".ts") }
Ten tweede, gebruik maken van de Typescript compiler definitie bestanden te genereren. Er zal een heleboel compiler fouten, maar kunnen we die negeren.
Get-ChildItem | foreach { tsc $_.Name }
Tot slot combineren alle *.d.tsbestanden in een index.d.ts, het verwijderen van de importverklaringen en het verwijderen van de defaultuit elke export verklaring.
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 $_ }
Dit eindigt met een enkele, bruikbaar index.d.tsbestand dat veel van de definities bevat.
Ik zou kijken voor een bestaande kaart brengen van uw 3rd party JS bibliotheken die Script # of SharpKit ondersteunen. Gebruikers van deze C # om cross-compilers JS zal het probleem dat u nu te maken te maken hebben en misschien een open source programma om uw 3rd party lib te scannen en om te zetten in het skelet C # klassen zijn gepubliceerd. Als dat zo is hacken de scanner programma typoscript te genereren in plaats van C #.
Als dat niet lukt, het vertalen van een C # openbare interface voor uw 3rd party lib in typoscript definities misschien eenvoudiger dan hetzelfde te doen door het lezen van de bron JavaScript zijn.
Mijn speciale interesse is ExtJS RIA kader Sencha en ik weet dat er zijn projecten gepubliceerd om een C # interpretatie te genereren voor het Script # of SharpKit
Bij het maken van uw eigen bibliotheek, kunt u kunt maken *.d.tsvan bestanden met behulp van de tscopdracht (typoscript Compiler) als volgt: (ervan uitgaande dat u uw bibliotheek gebouw naar de dist/libmap)
tsc -d --declarationDir dist/lib --declarationMap --emitDeclarationOnly
-d(--declaration): Genereert de*.d.tsbestanden--declarationDir dist/lib: Output map voor gegenereerde aangifte bestanden.--declarationMap: Genereert een sourcemap voor elke overeenkomstige bestand' .d.ts'.--emitDeclarationOnly: Alleen uitstoten' .d.ts' verklaring bestanden. (Geen gecompileerde JS)
(zie de documentatie voor alle command line compiler opties)
Of bijvoorbeeld in uw package.json:
"scripts": {
"build:types": "tsc -d --declarationDir dist/lib --declarationMap --emitDeclarationOnly",
}
en vervolgens uit te voeren: yarn build:types(of npm run build:types)