¿Cómo se produce un archivo de definición de “typings” .d.ts de una biblioteca de JavaScript existente?

Estoy usando muchas bibliotecas, tanto las mías como las de terceros. Veo que el directorio “typings” contiene algunos para Jquery y WinRT … pero ¿cómo se crean?

Hay algunas opciones disponibles para usted dependiendo de la biblioteca en cuestión, cómo está escrita y qué nivel de precisión está buscando. Repasemos las opciones, en orden de descendencia aproximadamente descendente.

Tal vez ya exista

Siempre marque DefinitelyTyped ( https://github.com/DefinitelyTyped/DefinitelyTyped ) primero. Este es un repository de la comunidad lleno literalmente de miles de archivos .d.ts y es muy probable que lo que estás usando ya esté allí. También debe verificar TypeSearch ( https://microsoft.github.io/TypeSearch/ ) que es un motor de búsqueda para archivos .d.ts publicados por NPM; esto tendrá un poco más definiciones que DefinitelyTyped. Algunos módulos también envían sus propias definiciones como parte de su distribución de NPM, así que también vea si ese es el caso antes de tratar de escribir el suyo propio.

Tal vez usted no necesita uno

TypeScript ahora es compatible con el indicador --allowJs y generará más inferencias basadas en JS en archivos .js. Puede intentar incluir el archivo .js en su comstackción junto con la configuración --allowJs para ver si esto le proporciona información de tipo suficientemente buena. TypeScript reconocerá cosas como las clases de estilo ES5 y los comentarios de JSDoc en estos archivos, pero es posible que se dispare si la biblioteca se inicializa de una manera extraña.

Comenzar con --allowJs

Si --allowJs le dio resultados decentes y desea escribir un archivo de definición mejor usted mismo, puede combinar --allowJs con --declaration para ver la “mejor conjetura” de TypeScript en los tipos de la biblioteca. Esto le dará un punto de partida decente, y puede ser tan bueno como un archivo escrito a mano si los comentarios de JSDoc están bien escritos y el comstackdor pudo encontrarlos.

Comienza con dts-gen

Si --allowJs no funcionó, es posible que desee utilizar dts-gen ( https://github.com/Microsoft/dts-gen ) para obtener un punto de partida. Esta herramienta utiliza la forma de tiempo de ejecución del objeto para enumerar con precisión todas las propiedades disponibles. En el lado positivo, esto tiende a ser muy preciso, pero la herramienta aún no admite raspar los comentarios de JSDoc para poblar tipos adicionales. Ejecutas esto así:

 npm install -g dts-gen dts-gen -m  

Esto generará your-module.d.ts en la carpeta actual.

Presiona el botón de posponer

Si solo quiere hacerlo todo más tarde y pasar sin tipos por un tiempo, en TypeScript 2.0 ahora puede escribir

 declare module "foo"; 

que te permitirá import el módulo "foo" con el tipo any . Si tiene un sistema global con el que desea tratar más adelante, solo escriba

 declare const foo: any; 

que te dará una variable foo .

Puede usar tsc --declaration fileName.ts como describe Ryan, o puede especificar declaration: true en compilerOptions en su tsconfig.json suponiendo que ya ha tenido un tsconfig.json en su proyecto.

La mejor manera de lidiar con esto (si un archivo de statement no está disponible en DefinitelyTyped ) es escribir declaraciones solo para las cosas que usa en lugar de la biblioteca completa. Esto reduce mucho el trabajo y, además, el comstackdor está ahí para ayudar, quejándose de los métodos faltantes.

Como dice Ryan, el comstackdor tsc tiene un --declaration que genera un archivo .d.ts de un archivo .ts . También tenga en cuenta que (salvo errores) se supone que TypeScript puede comstackr Javascript, por lo que puede pasar el código de JavaScript existente al comstackdor de tsc.

como se describe en http://channel9.msdn.com/posts/Anders-Hejlsberg-Steve-Lucco-and-Luke-Hoban-Inside-TypeScript at 00:33:52 habían creado una herramienta para convertir los metadatos WebIDL y WinRT en TypeScript d.ts

Buscaría una asignación existente de las bibliotecas JS de terceros que admitan Script # o SharpKit. Los usuarios de estos comstackdores cruzados de C # a .js habrán enfrentado el problema al que se enfrentan y podrían haber publicado un progtwig de código abierto para escanear su lib de terceros y convertirlo en esqueleto de clases de C #. Si es así, hackear el progtwig del escáner para generar TypeScript en lugar de C #.

En su defecto, traducir una interfaz pública de C # para su biblioteca de terceros en definiciones de TypeScript podría ser más simple que hacer lo mismo leyendo el código fuente de JavaScript.

Mi especial interés es el marco ExtJS RIA de Sencha y sé que se han publicado proyectos para generar una interpretación de C # para Script # o SharpKit.

Aquí hay algunos PowerShell que crean un único archivo de definición de TypeScript, una biblioteca que incluye múltiples archivos *.js con JavaScript moderno.

Primero, cambie todas las extensiones a .ts .

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

Segundo, use el comstackdor de TypeScript para generar archivos de definición. Habrá un montón de errores de comstackción, pero podemos ignorarlos.

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

Finalmente, combine todos los archivos *.d.ts en un index.d.ts , eliminando las declaraciones de import y eliminando el default de cada statement de exportación.

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

Esto finaliza con un único archivo index.d.ts utilizable que incluye muchas de las definiciones.