J'utilise beaucoup de bibliothèques à la fois mon propre et 3e partie. Je vois le répertoire « typages » contient quelques-uns pour Jquery et WinRT ... mais comment sont-ils créés?
Comment produire vous un .d.ts « typages » fichier de définition à partir d'une bibliothèque JavaScript existante?
Il y a quelques options disponibles pour vous en fonction de la bibliothèque en question, comment il est écrit, et quel niveau de précision que vous recherchez. Passons en revue les options, à peu près l'ordre décroissant de désirabilité.
Peut-être qu'il existe déjà
Toujours vérifier DefinitelyTyped ( https://github.com/DefinitelyTyped/DefinitelyTyped ) en premier. Ceci est une prise en pension complète communautaire de milliers de fichiers .d.ts et il est très probable que la chose que vous utilisez est déjà là. Vous devriez également vérifier TypeSearch ( https://microsoft.github.io/TypeSearch/ ) qui est un moteur de recherche pour les fichiers .d.ts publié MNP; cela aura des définitions légèrement plus que DefinitelyTyped. Quelques modules sont exportant également leurs propres définitions dans le cadre de leur distribution de NPM, donc voir également si tel est le cas avant d' essayer d'écrire votre propre.
Peut-être que vous ne avez pas besoin
Tapuscrit soutient maintenant le --allowJsdrapeau et fera plus des déductions basées sur JS dans des fichiers .js. Vous pouvez inclure le fichier .js dans votre compilation avec le --allowJsparamètre pour voir si cela vous donne assez bonne information de type. Tapuscrit reconnaîtra des choses comme des cours de style ES5 et commentaires jsdoc dans ces fichiers, mais peut se trébucher si la bibliothèque elle - même initialise d'une manière bizarre.
Commencez avec --allowJs
Si --allowJsvous a donné des résultats décents et que vous voulez écrire un meilleur fichier vous - même définition, vous pouvez combiner --allowJsavec --declarationpour voir « meilleure estimation » de tapuscrit les types de la bibliothèque. Cela vous donnera un point de départ décent, et peut être aussi bon que l' auteur d' un fichier à la main si les commentaires de jsdoc sont bien écrits et le compilateur a pu les trouver.
Commencez avec dts-gen
Si --allowJsne fonctionne pas, vous pouvez 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 d'é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 gratter les commentaires de jsdoc pour remplir d' autres types. Vous exécutez ce comme ceci:
npm install -g dts-gen
dts-gen -m <your-module>
Cela va générer your-module.d.tsdans le dossier en cours.
Appuyez sur le bouton Snooze
Si vous voulez juste faire tout plus tard et aller sans types pendant un certain temps, dactylographiée 2.0 vous pouvez maintenant écrire
declare module "foo";
qui vous permettra de importle "foo"module avec le type any. Si vous avez un monde que vous voulez traiter plus tard, il suffit d' écrire
declare const foo: any;
qui vous donnera une foovariable.
Vous pouvez utiliser tsc --declaration fileName.tscomme Ryan décrit, ou vous pouvez spécifier declaration: truedans compilerOptionsvotre tsconfig.jsonsupposant que vous avez déjà eu un tsconfig.jsonsous votre projet.
La meilleure façon de traiter cette (si un fichier de déclaration n'est pas disponible sur DefinitelyTyped ) est d'écrire des déclarations que pour les choses que vous utilisez plutôt que l'ensemble de la bibliothèque. Cela réduit le travail beaucoup - et en plus le compilateur est là pour aider en se plaignant de méthodes manquantes.
Comme le dit Ryan, le compilateur tsc dispose d' un commutateur --declarationqui génère un .d.tsfichier à partir d' un .tsfichier. Notez également que (bugs barrant) tapuscrit est censé être en mesure de compiler Javascript, vous pouvez passer le code existant javascript au compilateur tsc.
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 les métadonnées WebIDL et WinRT en tapuscrit d.ts
Voici quelques PowerShell qui crée un seul fichier de définition dactylographiée une bibliothèque qui comprend plusieurs *.jsfichiers avec JavaScript moderne.
Tout d' abord, changer toutes les extensions .ts.
Get-ChildItem | foreach { Rename-Item $_ $_.Name.Replace(".js", ".ts") }
En second lieu, utiliser le compilateur dactylographiée pour générer des fichiers de définition. Il y aura un tas d'erreurs du compilateur, mais nous pouvons ignorer ceux-ci.
Get-ChildItem | foreach { tsc $_.Name }
Enfin, combiner tous les *.d.tsfichiers en un seul index.d.ts, en supprimant les importdéclarations et la suppression defaultde chaque déclaration 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 $_ }
Cela se termine par un seul, utilisable index.d.tsfichier qui comprend un grand nombre de définitions.
Je chercherais une cartographie existante de votre 3ème partie JS bibliothèques qui prennent en charge Script # ou SharpKit. Les utilisateurs de ces C # pour .js compilateurs croisés face auront le problème que vous faites face maintenant et pourraient avoir publié un programme open source pour scanner votre lib 3ème partie et convertir en squelette C # classes. Si oui pirater le programme scanner pour générer tapuscrit en place de C #.
A défaut, la traduction d'un C # public interface pour votre 3ème partie lib dans les définitions de tapuscrit peut-être plus simple que de faire la même chose en lisant la source JavaScript.
Mon intérêt particulier est le cadre ExtJS RIA de Sencha et je sais qu'il ya eu des projets publiés pour générer une interprétation C # pour Script # ou SharpKit
Lorsque vous créez votre propre bibliothèque, vous pouvez créer des *.d.tsfichiers en utilisant la tsccommande (tapuscrit compilateur) comme ceci: ( en supposant que vous construisez votre bibliothèque au dist/libdossier)
tsc -d --declarationDir dist/lib --declarationMap --emitDeclarationOnly
-d(--declaration): Génère les*.d.tsfichiers--declarationDir dist/lib: Répertoire de sortie pour les fichiers de déclaration générés.--declarationMap: Génère un Sourcemap pour chaque fichier « .d.ts' correspondant.--emitDeclarationOnly: Émettre uniquement les fichiers de déclaration » .d.ts de. (Pas compilé JS)
(voir les documents pour toutes les options du compilateur de ligne de commande)
Ou par exemple dans votre package.json:
"scripts": {
"build:types": "tsc -d --declarationDir dist/lib --declarationMap --emitDeclarationOnly",
}
puis exécuter: yarn build:types(ou npm run build:types)













