visual studio for extension debug compiler code typescript typescript-typings visual-studio-2017

for - visual studio code typescript compiler on save



TypeScript en Visual Studio 2017: la inclusión automática de definiciones causa errores de duplicación de identificador (3)

Después de instalar VS 2017 recibí este error. Para deshacerme de él, actualicé mi sección de exclusión tsconfig.json con obj y bin.

"exclude": [ "node_modules", "obj", "bin" ]

ACTUALIZACIÓN: Tengo una solución que hace que las cosas funcionen de manera aceptable sin hacks. Dejo mis intentos anteriores descritos a continuación para la posteridad. Vea la respuesta para la solución de trabajo.

Acabo de actualizar un proyecto a Visual Studio 2017 y de repente recibo todo tipo de errores de TypeScript. Muchos de ellos son errores de Duplicate identifier . Cuando hago doble clic en uno de los errores, se abre un archivo llamado index.d.ts, ubicado en un directorio como:

C:/Users/[me]/AppData/Local/Microsoft/TypeScript/node_modules/@types/jquery/index.d.ts

Basado en lo que leí en esta página:

https://blogs.msdn.microsoft.com/visualstudio/2016/11/28/more-productive-javascript-in-visual-studio-2017-rc/

... parece que lo que está sucediendo es que Visual Studio está intentando descargar archivos de definición para los tipos en los que ya he incluido manualmente los archivos de definición. La inclusión automática de archivos de definición suena como una gran característica! Solo eliminaré los incluidos manualmente, ¿verdad? Pero nada de lo que hago parece funcionar. Espero que alguien me pueda decir a dónde me voy mal.

Para los antecedentes, la forma en que tuve que trabajar en Visual Studio 2015 fue la siguiente. Estaba haciendo uso de tres bibliotecas: jQuery, jQuery UI y QUnit. Simplemente descargué los archivos .d.ts de DefinitelyTyped y los puse en mi directorio de Scripts en mi proyecto, y todo funcionó correctamente hasta que abrí el proyecto en VS 2017.

De los mensajes de error, parece que Visual Studio 2017 está trayendo sus propios archivos de definición, así que pensé que simplemente eliminaría los que había traído manualmente. Sin embargo, cuando hago eso, ahora obtengo toneladas de Cannot find name $ errores de Cannot find name $ , lo que parece significar que esos archivos de definición ya no se introducen por algún motivo.

A continuación, pensé que tal vez el problema era que en realidad no tenía los archivos de origen JQuery (y otra biblioteca) en mi proyecto. Solo estoy haciendo referencia a ellos desde el CDN de Google en mi fuente HTML. El enlace de arriba hace que parezca que Visual Studio está buscando un archivo suelto real como indicador de que debería traer archivos de definición. Así que agregué archivos manualmente a mi directorio de Scripts y los reconstruí, pero nada cambió.

La página vinculada también habla sobre la inclusión de los archivos de la biblioteca de npm o bower, o el uso de un archivo tsconfig.json, pero antes de seguir esos caminos (que no forman parte de mi flujo de trabajo normal), espero que alguien pueda decirme, es ¿Existe una forma preferida de incluir definiciones de TypeScript en Visual Studio 2017? Gracias por adelantado.

ACTUALIZACIÓN: (Vea la Actualización 2 a continuación) También pude hacer que las cosas funcionen. Esto no fue exactamente intuitivo, por lo que estoy compartiendo mis pasos aquí con la esperanza de que a) ayude a alguien, yb) alguien pueda decirme si estoy haciendo esto de manera incorrecta.

  1. Elimine todo el código de TypeScript y los archivos de definición del proyecto.
  2. Abra packages.json y elimine cualquier referencia de archivo de definición allí también.
  3. Limpiar y construir. Sin errores ni advertencias.
  4. A través de NuGet, instale el archivo de definición que necesita (por ejemplo, para jQuery, el paquete que desea es "jquery.TypeScript.DefinitelyTyped").
  5. Esto instalará el archivo de definición en Scripts / typings / jquery.
  6. Haz lo mismo para otras bibliotecas que referencias.
  7. Agregue un nuevo archivo TypeScript de prueba y agregue una línea que intente utilizar una biblioteca, por ejemplo, var foo = $(document);
  8. IntelliSense funciona! Proyecto se construye! Parece que estamos de vuelta en el negocio!
  9. No tan rapido. Unos segundos más tarde, volvemos a tener errores de identificador duplicados. Parece que Visual Studio recogió los archivos de definición por su cuenta (tal vez activado por mi inclusión de los archivos de definición a través de NuGet) y ahora tenemos conflictos nuevamente.
  10. Agregue el archivo tsconfig.js con la siguiente directiva, que evita que Visual Studio descargue sus propias copias de los archivos de definición: { "compilerOptions": { "types": [] } }
  11. Errores desaparecidos.
  12. ¡No tan rapido! Segundos después, aparecen cientos de errores nuevos, que hacen referencia a los archivos de TypeScript que eliminé completamente de mi proyecto. Al abrir uno de los archivos a los que se hace referencia en la ventana de error, parece que se hicieron copias en <Project>/obj/Debug/... (la ruta era más larga pero olvidé grabarla)
  13. Ninguna cantidad de limpieza de la solución se deshace de estos archivos.
  14. Eliminar todo el directorio obj manualmente.
  15. Añadir todos mis archivos originales de TypeScript de nuevo en el proyecto.
  16. Reconstruir. ¡Éxito!

ACTUALIZACIÓN 2: Descubrí algunas deficiencias con el enfoque anterior. También tengo una mejor solución.

El uso de tsconfig.json tiene una gran desventaja. La opción de volver a compilar en guardar no funciona dentro de Visual Studio. Quiero que mi sitio se ejecute en modo de depuración, realice algunos cambios en TypeScript, haga clic en guardar y luego vea los cambios que se reflejan en el sitio.

Creo que una de las cosas que me estaba causando problemas era que tenía mis archivos de TypeScript en una carpeta que no era Scripts, que reservo para los archivos que deberían implementarse en el servidor tal cual. Supongo que Microsoft considera que este es un caso de uso no estándar.

Después de golpear mi cabeza contra la pared durante demasiado tiempo, encontré una solución simple, aunque intrépida. Tomé todos los subdirectorios en este directorio:

C:/Users/[me]/AppData/Local/Microsoft/TypeScript/node_modules/@types

y los movió a un directorio llamado Eliminado.

Bam. No más inclusión automática de definiciones, no más errores.

Microsoft, si está leyendo, por favor, brinde soporte para mi escenario, el cual, para reiterar, es:

  • Archivos de TypeScript almacenados en un directorio que no sea Scripts
  • Bibliotecas (como jQuery) incluidas mediante referencia a CDN de terceros
  • Archivos de definición para las bibliotecas anteriores incluidos directamente a través de NuGet.

ACTUALIZACIÓN 3: Finalmente lo puse en funcionamiento. Vea la respuesta a continuación para una solución no hacky.


Tuve este problema exacto en una aplicación antigua que actualicé a VS 2017, y lo solucioné siguiendo la respuesta de harley.333: Modificar la instalación para incluir el SDK de TypeScript 2.0.

No tengo el representante para comentar, pero para encontrarlo, debe pasar la pestaña a "Componentes individuales", luego se encuentra en el último grupo, "SDK, bibliotecas y marcos".

Instalar la captura de pantalla Typescript SDK


Lo tengo funcionando sin hacks. El truco es usar un archivo tsconfig.json y deshabilitar la inclusión automática de definiciones. En mi pregunta original, mencioné que intenté esto y descubrí que no podía usar compilar para guardar. Sin embargo, eso fue porque estaba tratando de usar la opción "ver", cuando realmente debería haber estado usando la opción "compileOnSave".

Este es mi conjunto completo de pasos de trabajo para transformar mi proyecto original roto en uno que funcione correctamente y continuará funcionando correctamente en una instalación no modificada de Visual Studio 2017 .

Agregue un archivo tsconfig.json a su proyecto en la raíz.

Configure su archivo con al menos:

{ "compilerOptions": { "types": [] } }

Pero quizás con otras opciones como quieras. Mi archivo se ve así:

{ "compileOnSave": true, "compilerOptions": { "types": [], "sourceMap": true, "target": "es5", "noEmitOnError": true } }

Puede obtener información sobre otras opciones de compilación aquí: https://www.typescriptlang.org/docs/handbook/compiler-options.html

Es la parte de "types":[] que impide la inclusión automática de definiciones.

Eso significa que depende de usted introducir definiciones para las bibliotecas que use. Afortunadamente, es muy fácil a través de NuGet. Por ejemplo, para jQuery, solo busque jquery.TypeScript.DefinitelyTyped e instale la versión apropiada. Esto creará carpetas en Scripts/typings .

Si estaba teniendo errores anteriormente, es posible que deba borrar algunos cruceros. Limpie su proyecto, elimine el directorio obj en la parte superior de la estructura de directorios de su proyecto , y ahora debería compilarse correctamente. Tuve un par de errores perdidos que desaparecieron cuando escribí algo en el archivo y luego lo guardé de nuevo. Un reinicio de Visual Studio también podría estar en orden.

¡Buena suerte!

ACTUALIZACIÓN: descubrí que cuando publico en Azure, volví a tener errores. Sin embargo, cuando agregué las directivas sugeridas por Perfa a mi archivo tsconfig.json, eliminé los directorios bin y obj y reinicié Visual Studio, esos errores tampoco aparecieron. Ahora he construido y reconstruido y publicado en Azure varias veces y parecen estar bien y realmente desaparecidos.

Para mayor claridad, mi archivo tsconfig.json completo ahora se ve así:

{ "compileOnSave": true, "compilerOptions": { "types": [], "sourceMap": true, "target": "es5", "noEmitOnError": true }, "exclude": [ "node_modules", "obj", "bin" ] }