Estoy usando muchas bibliotecas tanto propias como de terceros. Veo que el directorio "tipings" contiene algunos para Jquery y WinRT ... pero ¿cómo se crean?
Estoy usando muchas bibliotecas tanto propias como de terceros. Veo que el directorio "tipings" contiene algunos para Jquery y WinRT ... pero ¿cómo se crean?
Respuestas:
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 un orden de deseabilidad aproximadamente descendente.
Siempre verifique DefinitelyTyped ( https://github.com/DefinitelyTyped/DefinitelyTyped ) primero. Este es un repositorio comunitario lleno de literalmente 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 de definiciones que DefinitelyTyped. Algunos módulos también envían sus propias definiciones como parte de su distribución NPM, así que también vea si ese es el caso antes de intentar escribir la suya.
TypeScript ahora admite el --allowJs
indicador y hará más inferencias basadas en JS en archivos .js. Puede intentar incluir el archivo .js en su compilación junto con la --allowJs
configuración 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 puede tropezarse si la biblioteca se inicializa de manera extraña.
--allowJs
Si --allowJs
te dio resultados decentes y desea escribir un archivo de definición mejor a sí mismo, se puede combinar --allowJs
con --declaration
ver "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 creado a mano si los comentarios de JSDoc están bien escritos y el compilador pudo encontrarlos.
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 el raspado de los comentarios JSDoc para completar tipos adicionales. Ejecutas esto así:
npm install -g dts-gen
dts-gen -m <your-module>
Esto generará your-module.d.ts
en la carpeta actual.
Si solo quiere hacerlo todo más tarde y no usar tipos por un tiempo, en TypeScript 2.0 ahora puede escribir
declare module "foo";
que te permitirá import
el "foo"
módulo con tipo any
. Si tiene un global con el que desea tratar más tarde, solo escriba
declare const foo: any;
que te dará una foo
variable.
--declarations
genera tanto el .js
archivo como el .d.ts
archivo, lo que significa que solo necesita ejecutar una sola compilación.
--allowJs
con --declaration
opciones no se pueden combinar (probado en TypeScript 1.8 y 2.0). Si lo intento, obtengo:error TS5053: Option 'allowJs' cannot be specified with option 'declaration'
Puede usar tsc --declaration fileName.ts
como lo describe Ryan, o puede especificar declaration: true
debajo compilerOptions
en su tsconfig.json
suposición de que ya ha tenido un tsconfig.json
proyecto.
tsc --declaration test.ts
, aparece el error Cannot find name...
para los tipos para los que estoy tratando de crear un archivo de declaración :) ¿Necesito los tipos antes de poder declararlos?
declaration: true
a tu tsconfig.json
archivo?
La mejor manera de lidiar con esto (si un archivo de declaración no está disponible en DefinitelyTyped ) es escribir declaraciones solo para 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 los métodos faltantes.
Como dice Ryan, el compilador tsc tiene un interruptor --declaration
que genera un .d.ts
archivo a partir de un .ts
archivo. También tenga en cuenta que (salvo errores) se supone que TypeScript puede compilar Javascript, por lo que puede pasar el código javascript existente al compilador tsc.
como se describe en http://channel9.msdn.com/posts/Anders-Hejlsberg-Steve-Lucco-and-Luke-Hoban-Inside-TypeScript a las 00:33:52 habían construido una herramienta para convertir metadatos WebIDL y WinRT en TypeScript d.ts
Aquí hay algunos PowerShell que crean un único archivo de definición de TypeScript, una biblioteca que incluye varios *.js
archivos con JavaScript moderno.
Primero, cambie todas las extensiones a .ts
.
Get-ChildItem | foreach { Rename-Item $_ $_.Name.Replace(".js", ".ts") }
Segundo, use el compilador TypeScript para generar archivos de definición. Habrá un montón de errores de compilación, pero podemos ignorarlos.
Get-ChildItem | foreach { tsc $_.Name }
Finalmente, combine todos los *.d.ts
archivos en uno index.d.ts
, eliminando las import
declaraciones y eliminando las default
de 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 único index.d.ts
archivo utilizable que incluye muchas de las definiciones.
Al crear su propia biblioteca, puede crear *.d.ts
archivos utilizando el tsc
comando (Compilador TypeScript) de la siguiente manera: (suponiendo que esté creando su biblioteca en la dist/lib
carpeta)
tsc -d --declarationDir dist/lib --declarationMap --emitDeclarationOnly
-d
( --declaration
): genera los *.d.ts
archivos--declarationDir dist/lib
: Directorio de salida para archivos de declaración generados.--declarationMap
: Genera un mapa fuente para cada archivo '.d.ts' correspondiente.--emitDeclarationOnly
: Solo emite archivos de declaración '.d.ts'. (sin compilación JS)(vea los documentos para todas las opciones del compilador de línea de comandos)
O por ejemplo en tu package.json
:
"scripts": {
"build:types": "tsc -d --declarationDir dist/lib --declarationMap --emitDeclarationOnly",
}
y luego ejecuta: yarn build:types
(o npm run build:types
)
d.ts
archivos y poder usar interfaces. ¿Tienes algún ejemplo?
*.d.ts
archivos y los colocará en la dist/lib
carpeta. Necesita un tsconfig.json
archivo en la raíz de su proyecto, pero de todos modos debería estar allí para que el proyecto funcione.
Buscaría una asignación existente de sus bibliotecas JS de terceros que admitan Script # o SharpKit. Los usuarios de estos compiladores cruzados de C # a .js habrán enfrentado el problema que ahora enfrentan y podrían haber publicado un programa de código abierto para escanear su lib de terceros y convertirlas en esqueletos de clases de C #. Si es así, piratee el programa del escáner para generar TypeScript en lugar de C #.
De lo contrario, traducir una interfaz pública de C # para su biblioteca de terceros a definiciones de TypeScript podría ser más simple que hacer lo mismo leyendo el código fuente JavaScript.
Mi interés especial 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