Comment produisez-vous un.D. ts "Dactylographie" fichier de définition à partir d'une bibliothèque JavaScript existante?

j'utilise beaucoup de bibliothèques à la fois pour moi et pour des tiers. Je vois que le répertoire" typings " en contient pour Jquery et WinRT... mais comment sont-ils créés?

141
demandé sur user75525 2012-10-02 13:29:02

7 réponses

Il ya quelques options disponibles pour vous en fonction de la bibliothèque en question, la façon dont il est écrit, et le niveau de précision que vous recherchez. Examinons les options, par ordre décroissant de désirabilité.

Peut-Être Existe-T-Il Déjà

toujours vérifier DefinitelyTyped ( https://github.com/DefinitelyTyped/DefinitelyTyped ) d'abord. Il s'agit d'un repo communautaire rempli de littéralement des milliers de .d.les fichiers ts et il est très probable que la chose que vous utilisez est déjà là. Vous devez également vérifier TypeSearch ( https://microsoft.github.io/TypeSearch / ) qui est un moteur de recherche pour NPM-published .D. les fichiers ts; cela aura un peu plus de définitions que DefinitelyTyped. Quelques modules envoient aussi leurs propres définitions dans le cadre de leur distribution NPM, donc voyez aussi si c'est le cas avant d'essayer d'écrire les vôtres.

peut-être que tu N'en as pas besoin

Tapescript supporte maintenant le drapeau --allowJs et fera des inférences plus basées sur JS .js fichiers. Vous pouvez essayer, y compris l' .le fichier js dans votre compilation avec le paramètre --allowJs pour voir si cela vous donne assez d'informations de type. TypeScript reconnaîtra des choses comme les classes de style ES5 et les commentaires JSDoc dans ces fichiers, mais peut se déclencher si la bibliothèque s'initialise d'une manière étrange.

Get A Commencé Avec --allowJs

si --allowJs vous a donné des résultats décents et que vous voulez écrire un meilleur fichier de définition vous-même, vous pouvez combiner --allowJs avec --declaration pour voir" meilleure estimation " de dactylographier les types de la bibliothèque. Cela vous donnera un bon point de départ, et peut être aussi bon qu'un fichier écrit à la main si les commentaires de JSDoc sont bien écrits et que le compilateur a pu les trouver.

Get a Commencé avec le dts-gen

si --allowJs n'a pas fonctionné, vous pourriez vouloir utiliser dts-gen ( https://github.com/Microsoft/dts-gen ) pour obtenir un point de départ. Cet outil utilise la forme d'exécution de l'objet pour énumérer avec précision toutes les propriétés disponibles. Du côté positif, cela tend à être très précis, mais l'outil ne supporte pas encore le raclage des commentaires JSDoc pour remplir d'autres types. Vous exécutez ceci comme ceci:

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

cela générera your-module.d.ts dans le dossier en cours.

appuyez sur le bouton Snooze

si vous voulez juste faire tout cela plus tard et aller sans types pendant un certain temps, en TypeScript 2.0 vous pouvez maintenant écrire

declare module "foo";

qui vous permettra import le" module 1519120920 "avec le type any . Si vous avez un global que vous voulez traiter plus tard, il suffit d'écrire

declare const foo: any;

qui vous donnera une variable foo .

179
répondu Ryan Cavanaugh 2017-06-11 19:06:15

vous pouvez soit utiliser tsc --declaration fileName.ts comme Ryan décrit, ou vous pouvez spécifier declaration: true sous compilerOptions dans votre tsconfig.json en supposant que vous avez déjà eu un tsconfig.json dans votre projet.

31
répondu JayKan 2016-08-04 00:54:52

la meilleure façon de traiter cela (si un fichier de déclaration n'est pas disponible sur DefinitelyTyped ) est d'écrire des déclarations seulement pour les choses que vous utilisez plutôt que la bibliothèque entière. Cela réduit le travail beaucoup - et en outre le compilateur est là pour aider en se plaignant des méthodes manquantes.

15
répondu Gorgi Kosev 2015-10-19 09:08:04

comme dit Ryan, le compilateur tsc a un commutateur --declaration qui génère un fichier .d.ts à partir d'un fichier .ts . Notez également que (sauf bogues) le script est supposé être capable de compiler Javascript, donc vous pouvez passer le code javascript existant au compilateur tsc.

11
répondu CCoder 2017-02-22 10:32:14

comme décrit dans http://channel9.msdn.com/posts/Anders-Hejlsberg-Steve-Lucco-and-Luke-Hoban-Inside-TypeScript à 00:33:52 ils avaient construit un outil pour convertir WebIDL et WinRT des métadonnées dans la Machine d.ts

7
répondu zowers 2012-10-02 20:24:27

je chercherais un mapping existant de vos bibliothèques JS tierces qui supportent Script# ou SharpKit. Les utilisateurs de ces C# to .js cross compilers aura fait face au problème que vous rencontrez maintenant et pourrait avoir publié un programme open source pour scanner votre lib de tiers et de convertir en squelette c# classes. Si c'est le cas, hacker le programme de scanner pour générer le code à la place de C#.

sans cela, traduire un C # interface publique pour votre lib tierce partie en écriture dactylographiée les définitions pourraient être plus simples que de faire la même chose en lisant le JavaScript source.

mon intérêt particulier est Sencha's ExtJS RIA framework et je sais qu'il y a eu des projets publiés pour générer un c # interpretation pour Script# ou SharpKit

2
répondu camelCase 2012-10-04 17:37:44

voici quelques PowerShell qui crée un seul fichier de définition dactylographié une bibliothèque qui comprend plusieurs fichiers *.js avec JavaScript moderne.

d'abord, changez toutes les extensions en .ts .

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

Deuxièmement, utilisez le compilateur TypeScript pour générer des fichiers de définition. Il y aura un tas d'erreurs de compilation, mais on peut les ignorer.

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

Enfin, combiner tous les *.d.ts des fichiers en un index.d.ts , en supprimant le import états et la suppression de la default de chaque instruction d'exportation.

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

ceci se termine par un seul fichier index.d.ts utilisable qui comprend plusieurs définitions.

2
répondu Shaun Luttin 2016-11-01 15:45:47