Estoy usando una gran cantidad de bibliotecas tanto mi propia y tercera parte. Veo el directorio tipificaciones contiene algunos de jQuery y WinRT ... Pero, ¿cómo creé?
¿Cómo se produce un .d.ts "tipificaciones" archivo de definición de una biblioteca de JavaScript existente?
fuente por usuario Hotrodmonkey
En otros idiomas...
Hay algunas opciones disponibles para usted en función de la biblioteca en cuestión, la forma en que está escrito, y qué nivel de precisión que usted está buscando. Vamos a revisar las opciones, en orden de preferencia aproximadamente descendente.
Tal vez ya existe
Compruebe siempre DefinitelyTyped ( https://github.com/DefinitelyTyped/DefinitelyTyped ) primero. Se trata de un acuerdo de recompra comunidad llena de literalmente miles de archivos .d.ts y es muy probable que lo está utilizando ya está ahí. También debe comprobar TypeSearch ( https://microsoft.github.io/TypeSearch/ ), que es un motor de búsqueda de archivos .d.ts NPM-publicada; esto tendrá un poco más definiciones que DefinitelyTyped. Unos módulos también están enviando sus propias definiciones como parte de su distribución NGP, así también ver si ese es el caso, antes de intentar escribir el suyo propio.
Tal vez usted no necesita uno
Letra de imprenta ahora es compatible con la --allowJsbandera y hará más inferencias basadas en JS en archivos .js. Se puede intentar añadir el archivo .js en su compilación junto con la --allowJsconfiguración para ver si esto le da una buena información de tipo suficiente. Mecanografiado reconocerá cosas como clases de estilo ES5 y comentarios jsdoc en estos archivos, pero puede obtener disparado hacia arriba si la biblioteca se inicializa de una manera extraña.
Comienza Con --allowJs
Si --allowJste dio resultados decentes y desea escribir un archivo de definición mejor a sí mismo, se puede combinar --allowJscon --declarationver "mejor estimación" de mecanografiado 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 jsdoc son bien escritos y el compilador fue capaz de encontrarlos.
Comienza con DTS-gen
Si --allowJsno funciona, 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 de enumerar con precisión todas las propiedades disponibles. En el lado positivo esto tiende a ser muy preciso, pero la herramienta no es compatible aún raspando los comentarios jsdoc para poblar tipos adicionales. Ejecutar este modo:
npm install -g dts-gen
dts-gen -m <your-module>
Esto generará your-module.d.tsen la carpeta actual.
Presiona el botón de posponer
Si lo que desea es hacerlo todo más tarde y salir sin tipos durante un tiempo, por escrito 2.0 ahora se puede escribir
declare module "foo";
que le deje importel "foo"módulo con el tipo any. Si usted tiene un global que desea tratar de más adelante, acaba de escribir
declare const foo: any;
que le dará una foovariable.
También se puede usar tsc --declaration fileName.tscomo Ryan describe, o puede especificar declaration: truebajo compilerOptionsen su tsconfig.jsonsuponiendo que ya ha tenido unatsconfig.json bajo tu proyecto.
La mejor manera de lidiar con esto (si un expediente de declaración no está disponible en DefinitelyTyped ) es escribir las declaraciones sólo para las cosas que se utilizan en lugar de toda la biblioteca. Esto reduce mucho el trabajo - y, además, el compilador está ahí para ayudar a cabo por quejarse de los métodos que faltan.
Como dice Ryan, el compilador TSC tiene un interruptor --declarationque genera un .d.tsarchivo de un .tsarchivo. También tenga en cuenta que (errores de restricción) mecanografiado se supone que es capaz de compilar Javascript, por lo que puede pasar vigente código javascript para el compilador TSC.
como se describe en http://channel9.msdn.com/posts/Anders-Hejlsberg-Steve-Lucco-and-Luke-Hoban-Inside-TypeScript en 00:33:52 que habían construido una herramienta para convertir WebIDL y metadatos en WinRT d.ts mecanografiado
Aquí hay alguna PowerShell que crea un único archivo de definición de mecanografiado una biblioteca que incluye múltiples *.jsarchivos con JavaScript moderna.
En primer lugar, cambiar todas las extensiones .ts.
Get-ChildItem | foreach { Rename-Item $_ $_.Name.Replace(".js", ".ts") }
En segundo lugar, utilizar el compilador mecanografiado para generar archivos de definición. Habrá un montón de errores de compilación, pero podemos ignorar a aquellos.
Get-ChildItem | foreach { tsc $_.Name }
Por último, combine todos los *.d.tsarchivos en uno index.d.ts, la eliminación de las importdeclaraciones y la eliminación de la defaultde cada declaració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 sencillo, utilizable index.d.tsarchivo que incluye muchas de las definiciones.
Me gustaría ver una asignación existente de sus bibliotecas 3 ª parte JS que apoyan la escritura # o SharpKit. Los usuarios de estos C # para .JS compiladores cruzados se han enfrentado al problema que ahora enfrenta y podrían haber publicado un programa de código abierto para escanear su lib tercera parte y convertir en clases esqueleto de C #. Si es así cortar el programa de escáner para generar mecanografiado en lugar de C #.
De no ser así, la traducción de una interfaz pública de C # para su lib tercera parte en las definiciones mecanografiado podría ser más simple que hacer lo mismo mediante la lectura de la fuente de JavaScript.
Mi interés especial es el marco ExtJS RIA de Sencha y sé que se han publicado proyectos para generar un C # interpretación de la escritura # o SharpKit
Al crear su propia biblioteca, puede crear *.d.tsarchivos usando el tsccomando (mecanografiado compilador), así: (suponiendo que usted está construyendo su biblioteca a la dist/libcarpeta)
tsc -d --declarationDir dist/lib --declarationMap --emitDeclarationOnly
-d(--declaration): Genera los*.d.tsarchivos--declarationDir dist/lib: Directorio de salida para archivos de declaración generados.--declarationMap: Genera un Sourcemap para cada archivo correspondiente'.d.ts.--emitDeclarationOnly: Sólo emiten ficheros de declaración'.d.ts. (Sin JS compilado)
(ver los documentos para todas las opciones de línea de comandos del compilador)
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)