Typescript-declaratiebestanden genereren vanuit javascript

Stel bijvoorbeeld dat je een npm-bibliotheek hebt, in mijn geval mongoose, hoe zou je te werk gaan om d.ts-bestanden te genereren?


Antwoord 1, autoriteit 100%

JavaScript bevat niet altijd genoeg type-informatie voor de TypeScript-compiler om de structuren in uw code af te leiden – dus het automatisch genereren van een definitie op basis van JavaScript is zelden een optie.

Hier vindt u instructies om ze helemaal opnieuw te schrijven:

https://www.stevefenton.co .uk/2013/01/complex-typescript-definitions-made-easy/

Maar er is één truc die zou kunnen werken (het werkt alleen in een beperkt aantal gevallen).

Als je JavaScript in een nieuw TypeScript-bestand plakt, eventuele triviale fouten oplost en het compileert met behulp van de definitievlag, kan het je misschien een bestand bezorgen dat op zijn minst een startpunt zou zijn.

tsc --declaration js.ts

Antwoord 2, autoriteit 49%

De vraag is een beetje oud, maar voor mensen die afkomstig zijn van zoekmachines zoals ik, als je op zoek bent naar een geautomatiseerde tool, kijk dan eens naar:

  • Microsoft/dts-gen

    Het officiële uitgangspunt dat Microsoft gebruikt bij het maken van typen. Het is echter alleen bedoeld als een startpunt en ik heb niet veel geluk gehad, afhankelijk van het alleen

  • dtsmake

    Deze ziet er veelbelovend uit. Het hangt af van Ternjs die sommige editors gebruiken om JS-code automatisch aan te vullen. Bekijk Ternjs ook voor andere gereedschapsnamen en vergelijkingen ermee.

Update (2021): Het is een goed idee om npmtrends te controleren en dts-generator, dts-gen, dtsmake, npm-dtsen alternatieven.


Antwoord 3, autoriteit 26%

Voor andere mensen die dit bericht via google vinden: er is nu een generator van Microsoft zelf: dts-gen.


Antwoord 4, autoriteit 10%

Als u een JavaScript-bibliotheek van derden in uw TypeScript-bestand probeert te gebruiken, kunt u overal in uw project een aangepast (en bijna leeg) declaratiebestand maken.

Als u bijvoorbeeld wilt importeren:

import * as fooLibrary from 'foo-lib';

U zou een nieuw bestand maken met de naam ‘foo-lib.d.ts’ met de volgende inhoud:

declare module 'foo-lib' {
  var fooLibrary: any;
  export = fooLibrary;
}

Antwoord 5, autoriteit 6%

Voor mijn specifieke situatie, waar ik werkte met verduisterde code van een derde partij, vond ik het handig om het script op een pagina te laden en vervolgens de console te gebruiken om een ​​instantie van de verduisterde klasse te loggen. De console geeft je een mooi overzicht van de klassenmethoden en eigenschappen die je kunt kopiëren en gebruiken als startpunt van een definitiebestand.

> o = new ObfuscatedClass()
> console.log(o)
ObfuscatedClass
- methodA(a,b){some implementation}
- methodB(a,b){other implementation} etc

die je kunt kopiëren, plakken en bewerken

declare class ObfuscatedClass {
    methodA(a,b);
    methodB(a,b);
}

Antwoord 6

Misschien wil je eens kijken naar het “npm-dts” NPM-pakket. Het is een hulpmiddel voor het genereren van een enkel index.d.ts-bestand voor uw NPM-pakket, zodat het direct door andere TypeScript-pakketten kan worden gebruikt.

Other episodes