¿Cómo se puede producir una .d.ts "tipificaciones" archivo de definición a partir de una biblioteca de JavaScript?
-
12-12-2019 - |
Pregunta
Estoy usando un montón de bibliotecas tanto en mi propia y la 3ª parte.Yo veo la "tipificaciones" directorio contiene algunos de Jquery y WinRT...pero ¿cómo se crea?
Solución
Hay un par de opciones disponibles para usted dependiendo de la biblioteca en cuestión, cómo se escribe, y qué nivel de precisión que usted está buscando.Vamos a revisar las opciones, aproximadamente en el orden descendente de conveniencia.
Tal Vez Ya Existe
Compruebe siempre DefinitelyTyped (https://github.com/DefinitelyTyped/DefinitelyTyped) en primer lugar.Esta es una comunidad repo completo de, literalmente, miles de .d.archivos de ts y es muy probable que la cosa está utilizando ya está ahí.También debe comprobar TypeSearch (https://microsoft.github.io/TypeSearch/), que es un motor de búsqueda para NPM-publicado .d.archivos de ts;esto va a tener un poco más de las definiciones de DefinitelyTyped.Algunos módulos son también el envío de sus propias definiciones, como parte de su MECANISMO nacional de prevención de distribución, así también a ver si es el caso, antes de tratar de escribir su propio.
Tal vez Usted no Necesita Uno
Manuscrito ahora es compatible con el --allowJs
bandera y hará que más de la JS-basado en inferencias en .js archivos.Usted puede intentar incluyendo la .archivo js en su compilación junto con el --allowJs
configuración para ver si esto le da a usted suficientemente bueno tipo de información.Los manuscritos reconocer las cosas como ES5-las clases de estilo y JSDoc comentarios en estos archivos, pero puede que se tropezó si la biblioteca se inicializa a sí mismo de una manera extraña.
Empezar Con --allowJs
Si --allowJs
le dio buenos resultados y se desea escribir un mejor archivo de definición de sí mismo, usted puede combinar --allowJs
con --declaration
para ver el Manuscrito de la "mejor estimación" en los tipos de la biblioteca.Esto le dará un punto de partida decente, y puede ser tan buena como la de una mano-autor del archivo si el JSDoc comentarios son bien escrito y el compilador era capaz de encontrarlos.
Empezar con dts-gen
Si --allowJs
no funciona, es posible que desee utilizar dts-gen (https://github.com/Microsoft/dts-gen para obtener un punto de partida.Esta herramienta utiliza el tiempo de ejecución de la forma del objeto con precisión enumerar todas las propiedades disponibles.En el lado positivo de esto tiende a ser muy exacta, pero la herramienta no es compatible aún con raspado de la JSDoc comentarios para rellenar tipos adicionales.Ejecutar esta así:
npm install -g dts-gen
dts-gen -m <your-module>
Esto va a generar your-module.d.ts
en la carpeta actual.
Golpear el Botón de Repetición
Si sólo quieres hacer todo más tarde y sin tipos, por un tiempo, en el Manuscrito 2.0 ahora se puede escribir
declare module "foo";
que te permitirá import
el "foo"
módulo con el tipo any
.Si usted tiene un mundial se desea tratar más tarde, acaba de escribir
declare const foo: any;
que le dará un foo
variable.
Otros consejos
Usted puede utilizar tsc --declaration fileName.ts
como Ryan se describe, o puede especificar declaration: true
bajo compilerOptions
en su tsconfig.json
suponiendo que usted ya haya tenido un tsconfig.json
marco de su proyecto.
La mejor manera de lidiar con esto (si un archivo de declaración no está disponible en definitivamentetyped ) es paraEscribe declaraciones solo por las cosas que usa en lugar de toda la biblioteca.Esto reduce mucho el trabajo, y además el compilador está ahí para ayudar al quejarse de métodos faltantes.
Como dice Ryan, el compilador TSC tiene un conmutador --declaration
que genera un archivo .d.ts
de un archivo .ts
.También tenga en cuenta que (errores de BETRS) se supone que puede compilar JavaScript, por lo que puede pasar el código JavaScript existente al compilador TSC.
Como se describe en http://channel9.msdn.COM / Publicaciones / Anders-Hejlsberg-Steve-Lucco-and-Luke-Hoban-Interior-Typyscript A 00:33:52 Habían construido una herramienta para convertir a Webidl y WinRT Metadata en TypeScript D.TS
He aquí algunos de PowerShell que se crea un único Manuscrito del archivo de definición de una biblioteca que incluye varios *.js
los archivos con JavaScript moderno.
En primer lugar, el cambio de todas las extensiones a .ts
.
Get-ChildItem | foreach { Rename-Item $_ $_.Name.Replace(".js", ".ts") }
En segundo lugar, utilizar el Manuscrito compilador para generar los archivos de definición.Habrá un montón de errores del compilador, pero podemos ignorarlos.
Get-ChildItem | foreach { tsc $_.Name }
Finalmente, se combinan todos los *.d.ts
archivos en uno solo index.d.ts
, la eliminación de la import
las declaraciones y la eliminación de la default
de cada instrucción 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 termina con un único utilizable index.d.ts
archivo que incluye muchas de las definiciones.
Buscaría un mapeo existente de sus bibliotecas de JS de tercera parte que admiten el script # o Sharpkit.Los usuarios de estos compiladores cruzados C # a .js habrán enfrentado al problema que enfrentó ahora y podría haber publicado un programa de código abierto para escanear su liber de terceros y convertir en las clases de Skeleton C #.Si es así, haga clic en el programa de escáner para generar TypeScript en lugar de C #.
Fallar que, traducir una interfaz pública C # para su LIB de tercera parte en las definiciones de TypeScript puede ser más sencilla que hacer lo mismo al leer la fuente JavaScript.
Mi interés especial es el marco de RIA EXTJS de Sencha y sé que ha habido proyectos publicados para generar una interpretación C # para el script # o Sharpkit
A la hora de crear su propia biblioteca, puede crear *.d.ts
archivos mediante el uso de la tsc
(Manuscrito Compilador) comando así:(suponiendo que la construcción de su biblioteca a la dist/lib
carpeta)
tsc -d --declarationDir dist/lib --declarationMap --emitDeclarationOnly
-d
(--declaration
):genera el*.d.ts
los archivos--declarationDir dist/lib
:Directorio de salida para generar la declaración de los archivos.--declarationMap
:Genera un sourcemap para cada 'correspondiente.d.ts' archivo.--emitDeclarationOnly
:Sólo las emisiones".d.ts declaración de los archivos.(no compilado JS)
(consulte la docs para todos compilador de línea de comando opciones)
O por ejemplo en su package.json
:
"scripts": {
"build:types": "tsc -d --declarationDir dist/lib --declarationMap --emitDeclarationOnly",
}
y, a continuación, ejecute: yarn build:types
(o npm run build:types
)