Rendimiento de TypeScript







Hay formas sencillas de configurar TypeScript para acelerar la compilación y la edición. Y cuanto antes se implementen, mejor. También existen algunos enfoques populares para investigar las causas de la compilación y edición lentas, algunas correcciones y formas comunes de ayudar al equipo de TypeScript a investigar problemas.



1. Escribir código fácil de compilar



1.1. Preferencia por interfaces sobre intersecciones (intersección)



La mayoría de las veces, un alias simple para un tipo de objeto actúa de la misma manera que una interfaz.



interface Foo { prop: string }

type Bar = { prop: string };

      
      





Pero si necesita una combinación de dos o más tipos, puede extenderlos usando una interfaz o crear una intersección de tipos dentro de un alias. La diferencia entre estos enfoques es importante.



Las interfaces crean un único tipo de objeto aplanar que expone los conflictos de propiedad que generalmente son importantes de resolver. Y las intersecciones simplemente combinan propiedades de forma recursiva y, en algunos casos, generan never



. Además, las interfaces se representan mejor, mientras que los alias de tipo para las intersecciones no se pueden mostrar en la otra parte de la intersección. Las relaciones de tipos entre interfaces se almacenan en caché, a diferencia de los tipos de intersección. La última diferencia importante es que cuando se valida contra el tipo de intersección de destino, cada componente se valida antes de validarse / aplanarse.



Por lo tanto, se recomienda extender los tipos con interface



/ en extends



lugar de crear intersecciones de tipos.



- type Foo = Bar & Baz & {
-     someProp: string;
- }
+ interface Foo extends Bar, Baz {
+     someProp: string;
+ }

      
      





1.2. Usar anotaciones de tipo



Agregar anotaciones de tipo, especialmente para los valores de retorno, puede ahorrarle mucho trabajo al compilador. Esto se debe en parte a que los tipos con nombre suelen ser más compactos que los tipos anónimos (que el compilador puede emitir), lo que reduce el tiempo que lleva leer y escribir archivos de declaración (por ejemplo, para compilaciones incrementales). El casting es muy conveniente, por lo que no es necesario hacerlo universalmente. Pero puede ser útil intentarlo cuando encuentre fragmentos lentos en su código.



- import { otherFunc } from "other";
+ import { otherFunc, otherType } from "other";

- export function func() {
+ export function func(): otherType {
      return otherFunc();
  }

      
      





1.3. Preferencia por tipos base sobre varios tipos



Los tipos múltiples son una gran herramienta: le permiten expresar el rango de valores posibles para un tipo.



interface WeekdaySchedule {
  day: "Monday" | "Tuesday" | "Wednesday" | "Thursday" | "Friday";
  wake: Time;
  startWork: Time;
  endWork: Time;
  sleep: Time;
}

interface WeekendSchedule {
  day: "Saturday" | "Sunday";
  wake: Time;
  familyMeal: Time;
  sleep: Time;
}

declare function printSchedule(schedule: WeekdaySchedule | WeekendSchedule);

      
      





Pero todo tiene un precio. Cada vez que se le pasa un argumento printSchedule



, debe compararse con cada elemento del conjunto. Este no es un problema para dos elementos. Pero si hay una docena de elementos en el conjunto, puede ralentizar la velocidad de compilación. Por ejemplo, para eliminar elementos redundantes, todos deben compararse en pares, esta es una función cuadrática. Estos controles pueden ocurrir cuando se cruzan conjuntos grandes, cuando la intersección de cada elemento del conjunto puede dar lugar a la aparición de tipos enormes que deben reducirse. Y todo esto se puede evitar utilizando subtipos en lugar de conjuntos.



interface Schedule {
  day: "Monday" | "Tuesday" | "Wednesday" | "Thursday" | "Friday" | "Saturday" | "Sunday";
  wake: Time;
  sleep: Time;
}

interface WeekdaySchedule extends Schedule {
  day: "Monday" | "Tuesday" | "Wednesday" | "Thursday" | "Friday";
  startWork: Time;
  endWork: Time;
}

interface WeekendSchedule extends Schedule {
  day: "Saturday" | "Sunday";
  familyMeal: Time;
}

declare function printSchedule(schedule: Schedule);

      
      





Un ejemplo más realista es cuando se intenta modelar todos los tipos de elementos DOM integrados. En este caso, es preferible crear un tipo base HtmlElement



con elementos frecuentes, que se expanda con DivElement



, ImgElement



etc., en lugar de crear un conjunto pesado DivElement | /*...*/ | ImgElement | /*...*/



.



2. Uso de vínculos a proyectos



Al crear cualquier base de código grande de TypeScript, es útil organizarla en varios proyectos independientes . Cada uno de ellos tiene el suyo propio tsconfig.json



con dependencias en otros proyectos. Esto puede ayudar a evitar la descarga de demasiados archivos en una compilación y también puede facilitar la combinación y combinación de diferentes esquemas de base de código.



Hay algunas formas muy sencillas de dividir su código base en proyectos . Por ejemplo, un proyecto para un cliente, un proyecto para un servidor y un proyecto común entre ellos.



             ------------
              |          |
              |  Shared  |
              ^----------^
             /            \
            /              \
------------                ------------
|          |                |          |
|  Client  |                |  Server  |
-----^------                ------^-----

      
      





Las pruebas también se pueden separar en un proyecto separado.



             ------------
              |          |
              |  Shared  |
              ^-----^----^
             /      |     \
            /       |      \
------------  ------------  ------------
|          |  |  Shared  |  |          |
|  Client  |  |  Tests   |  |  Server  |
-----^------  ------------  ------^-----
     |                            |
     |                            |
------------                ------------
|  Client  |                |  Server  |
|  Tests   |                |  Tests   |
------------                ------------

      
      





La gente suele preguntar: "¿Qué tan grande debería ser el proyecto?" Es como preguntar: "¿Qué tan grande debe ser una función?" o "¿Qué tan grande debe ser la clase?" Depende mucho de la experiencia. Digamos que puede compartir código JS / TS usando carpetas, y si algunos componentes están lo suficientemente interconectados como para colocarse en una carpeta, entonces puede considerarlos que pertenecen al mismo proyecto. Además, evite proyectos grandes o pequeños. Si uno de ellos es más grande que todos los demás combinados, entonces esta es una mala señal. También es mejor no crear docenas de proyectos de un solo archivo porque esto aumenta la sobrecarga.



Puede leer acerca de los enlaces entre proyectos aquí .



3. Configuración de tsconfig.json o jsconfig.json



Los usuarios de TypeScript y JavaScript siempre pueden personalizar sus compilaciones utilizando el archivo tsconfig.json. Los archivos Jsconfig.json también se pueden usar para personalizar la edición de JavaScript .



3.1. Definición de archivos



Siempre asegúrese de que sus archivos de configuración no incluyan demasiados archivos a la vez.



Puede tsconfig.json



definir archivos de proyecto de dos formas:



  • lista files



    ;
  • listas include



    y exclude



    ;


La principal diferencia entre los dos es que files



obtiene una lista de rutas de archivo de origen y include



/ exclude



usa patrones globales para identificar los archivos correspondientes.



Al definir files



, permitimos que TypeScript cargue archivos directamente de forma rápida. Esto puede resultar engorroso si el proyecto tiene muchos archivos y solo unos pocos puntos de entrada de alto nivel. También es fácil olvidarse de agregar nuevos archivos tsconfig.json



y luego se encuentra con un comportamiento extraño del editor.



include



/ exclude



no requiere que se identifiquen todos estos archivos, pero el sistema debería detectarlos revisando los directorios agregados. Y si hay muchos , la compilación puede ralentizarse. Además, en ocasiones la compilación incluye numerosos.d.ts



y archivos de prueba, que también pueden reducir la velocidad y aumentar el consumo de memoria. Finalmente, si bien exclude



existen valores predeterminados adecuados en algunas configuraciones, como los repositorios mono, existen carpetas "pesadas" como las node_modules



que se agregarán en el momento de la compilación.



Es mejor hacer esto:



  • Defina solo las carpetas de entrada de su proyecto (por ejemplo, el código fuente desde el que desea agregar durante la compilación y el análisis).
  • No mezcle archivos de origen de diferentes proyectos en la misma carpeta.
  • Si almacena pruebas en la misma carpeta de origen, asígneles un nombre para que puedan excluirse fácilmente.
  • Evite crear grandes artefactos de ensamblaje y carpetas de dependencia como node_modules



    .


Nota: Sin una lista, la exclude



carpeta node_modules



se excluirá de forma predeterminada. Y si se agregará la lista, es importante indicarlo explícitamente node_modules



.



He aquí un ejemplo tsconfig.json



:



{
    "compilerOptions": {
        // ...
    },
    "include": ["src"],
    "exclude": ["**/node_modules", "**/.*/"],
}

      
      





3.2. Control sobre la adición de @types



De forma predeterminada, TypeScript agrega automáticamente todos los node_modules



paquetes que se encuentran en una carpeta @types



, ya sea que los haya importado o no. Esto es para hacer que ciertas funciones “simplemente funcionen” cuando se usa Node.js, Jasmine, Mocha, Chai, etc., ya que estas herramientas / paquetes no se importan, sino que se cargan en el entorno global.



A veces, esta lógica puede ralentizar la compilación y edición del programa. E incluso provocar conflictos de declaración en numerosos paquetes globales que provocan errores como este:



Duplicate identifier 'IteratorResult'.
Duplicate identifier 'it'.
Duplicate identifier 'define'.
Duplicate identifier 'require'.

      
      





Si no se necesitan paquetes globales, puede definir una carpeta vacía en la opción "tipos" en tsconfig.json



/ jsconfig.json



:



// src/tsconfig.json
{
   "compilerOptions": {
       // ...

       // Don't automatically include anything.
       // Only include `@types` packages that we need to import.
       "types" : []
   },
   "files": ["foo.ts"]
}

      
      





Si necesita paquetes globales, agréguelos al campo types



.



// tests/tsconfig.json
{
   "compilerOptions": {
       // ...

       // Only include `@types/node` and `@types/mocha`.
       "types" : ["node", "mocha"]
   },
   "files": ["foo.test.ts"]
}

      
      





3.3. Generación incremental de proyectos



La bandera --incremental



permite que TypeScript guarde el último estado compilado en un archivo .tsbuildinfo



. Se utiliza para definir el conjunto mínimo de archivos que se pueden volver a comprobar / sobrescribir desde la última ejecución, como el modo --watch



en TypeScript.



La generación incremental está habilitada de forma predeterminada cuando se usa la composite



marca de enlace entre proyectos, pero también puede acelerar cualquier otro proyecto.



3.4. Omitir validación .d.ts



De forma predeterminada, TypeScript volverá a comprobar todos los .d.ts



archivos de un proyecto para encontrar problemas e incoherencias. Pero esto generalmente no es necesario. La mayoría de las veces, ya se sabe que estos archivos funcionan: los métodos de expansión de tipos ya se han verificado, pero las declaraciones importantes aún se verificarán.



TypeScript permite que una bandera skipDefaultLibCheck



omita la verificación de tipos en los .d.ts



archivos suministrados (por ejemplo, in lib.d.ts



).



También puede habilitar la bandera skipLibCheck



para omitir la verificación de todos los .d.ts



archivos en la compilación.



Estas dos opciones a menudo ocultan errores de configuración y conflictos de .d.ts



archivos, por lo que se recomienda usarlas solo para acelerar la compilación.



3.5. Verificaciones variadic más rápidas



¿Lista de perros o animales? ¿Puedes conducir List<Dg>



a List<Animls>



? Una forma fácil de encontrar la respuesta es comparar estructuralmente los tipos, elemento por elemento. Desafortunadamente, esta solución puede resultar muy cara. Pero si sabemos lo suficiente sobre List<>



, entonces podemos reducir los controles de asignación de determinar si es permisible para referirse Dog



a Animal



(es decir, sin comprobar cada elemento List<>



). En particular, necesitamos conocer la variabilidad del tipo de parámetro T



. El compilador solo puede aprovechar al máximo la optimización si el indicador está activado strictFunctionTypes



(de lo contrario, utilizará una verificación estructural más lenta pero más indulgente). Por lo tanto, se recomienda construir con la bandera --strictFunctionTypes



(que está habilitada por defecto en --strict



).



4. Configuración de otras herramientas de montaje



TypeScript a menudo se compila con otras herramientas de construcción, especialmente cuando se crea una aplicación web que puede usar bundler. Solo podemos ofrecer algunas ideas, pero en general este enfoque puede generalizarse.



Además de esta parte, asegúrese de leer sobre el rendimiento de su herramienta elegida, por ejemplo:





4.1. Verificación de tipo simultánea



La verificación de tipos generalmente requiere información de otros archivos y es relativamente costosa en comparación con otros pasos como convertir / escribir código. Dado que la verificación de tipos puede llevar bastante tiempo, puede afectar el ciclo de desarrollo interno. Es decir, el ciclo de edición, compilación y ejecución será más largo, lo que es desagradable.



Por lo tanto, muchas herramientas de compilación pueden verificar los tipos en un proceso separado, sin bloquear la creación de archivos. Aunque en este caso, se puede ejecutar código erróneo antes de que TypeScript informe el error en su herramienta de compilación. La mayoría de las veces, primero verá errores en el editor y no esperará a que se ejecute el código.



Un ejemplo es fork-ts-checker-webpack-plugin para Webpack, o similarimpresionante-mecanografiado-loader .



4.2. Creación de archivos aislados



De forma predeterminada, la creación de archivos en TypeScript requiere información semántica que puede no ser local para el archivo. Esto es necesario para comprender cómo se generan las características const enum



y cómo se generan namespace



. Pero a veces la generación se vuelve más lenta debido a la necesidad de verificar otros archivos para generar el resultado de un archivo arbitrario.



Rara vez necesitamos funciones que requieran información no local. En enum



su lugar const enum



, se pueden usar regulares y en su lugar se pueden usar módulos namespace



. Por lo tanto, TypeScript tiene una bandera isolatedModules



para lanzar errores en funciones que requieren información no local. Con esta marca, puede utilizar de forma segura herramientas que utilizan API de TypeScript como transpileModule



compiladores alternativos como Babel.



Este código no funcionará correctamente en tiempo de ejecución con la conversión de archivos aislados porque los valores deben estar en línea const enum



. Afortunadamente, nos isolatedModules



avisará con antelación.



// ./src/fileA.ts

export declare const enum E {
    A = 0,
    B = 1,
}

// ./src/fileB.ts

import { E } from "./fileA";

console.log(E.A);
//          ~
// error: Cannot access ambient const enums when the '--isolatedModules' flag is provided.

      
      





Recuerde: isolatedModules



no acelera automáticamente la generación de código. Solo advierte sobre el uso de una función que puede no ser compatible. Necesita generar módulos de forma aislada en diferentes herramientas de compilación y API.



Puede crear archivos de forma aislada utilizando las siguientes herramientas:





5. Investigación de problemas



Hay diferentes formas de averiguar por qué algo va mal.



5.1. Deshabilitar los complementos del editor



Los complementos pueden afectar el funcionamiento del editor. Intente deshabilitarlos (especialmente los relacionados con JavaScript / TypeScript) y vea si el rendimiento y la capacidad de respuesta mejoran.



Algunos editores tienen sus propias recomendaciones para mejorar el rendimiento, léalas. Por ejemplo, Visual Studio Code tiene una página de sugerencias separada .



5.2. ExtendedDiagnostics



Puede ejecutar TypeScript con --extendedDiagnostics



para ver dónde se gasta el tiempo del compilador:



Files:                         6
Lines:                     24906
Nodes:                    112200
Identifiers:               41097
Symbols:                   27972
Types:                      8298
Memory used:              77984K
Assignability cache size:  33123
Identity cache size:           2
Subtype cache size:            0
I/O Read time:             0.01s
Parse time:                0.44s
Program time:              0.45s
Bind time:                 0.21s
Check time:                1.07s
transformTime time:        0.01s
commentTime time:          0.00s
I/O Write time:            0.00s
printTime time:            0.01s
Emit time:                 0.01s
Total time:                1.75s

      
      





Tenga en cuenta que Total time



no será la suma de todos los costos de tiempo enumerados, ya que algunos de ellos se superponen y otros no se miden en absoluto.



La información más relevante para la mayoría de usuarios:



Campo Valor
Files





La cantidad de archivos incluidos en el programa (qué tipo de archivos puede ver usando --listFiles



).
I/O Read time





Tiempo dedicado a la lectura del sistema de archivos. Esto incluye la lectura de carpetas de include



.
Parse time





Tiempo dedicado a escanear y analizar el programa.
Program time





El tiempo total para leer del sistema de archivos, escanear y analizar el programa, así como otros cálculos de gráficos. Estas etapas se combinan aquí porque deben habilitarse y cargarse tan pronto como se agreguen mediante import



y export



.
Bind time





Tiempo dedicado a reunir información semántica diversa que es local para un archivo específico.
Check time





El tiempo dedicado a verificar los tipos en el programa.
transformTime time





Tiempo dedicado a reescribir AST de TypeScript (árboles que representan archivos de origen) en formularios que funcionan en entornos de ejecución heredados.
commentTime





Tiempo dedicado a evaluar comentarios en archivos generados.
I/O Write time





Tiempo dedicado a escribir y actualizar archivos en disco.
printTime





El tiempo necesario para calcular la representación de cadena del archivo generado y guardarlo en el disco.


Dadas estas entradas, lo que podría necesitar:



  • ¿El número de archivos / líneas de código corresponde aproximadamente al número de archivos del proyecto? Si no es así, intente usar --listFiles



    .
  • ¿ Valores Program time



    o I/O Read time



    apariencia grande? Compruebe si la configuración es correcta include



    /exclude





¿Parece que hay algún problema con otros tiempos? ¡Puede completar un informe de problemas! Qué te ayudará a diagnosticar:



  • Empiece por emitDeclarationOnly



    si el valor es printTime



    alto.
  • Instrucciones para informar problemas de rendimiento del compilador




5.3. showConfig



No siempre está claro con qué configuraciones se realiza la compilación al inicio tsc



, especialmente considerando que tsconfig.jsons



otros archivos de configuración se pueden extender. showConfig



puede explicar lo que calculará tsc



.



tsc --showConfig

# or to select a specific config file...

tsc --showConfig -p tsconfig.json

      
      





5.4. traceResolution



Ejecutar con traceResolution



le dirá por qué se agregó el archivo a la compilación. Los datos son bastante extensos, por lo que puede guardar el resultado en un archivo:



tsc --traceResolution > resolution.txt

      
      





Si encuentra un archivo que no debería estar allí, puede corregir la lista include



/ exclude



en el archivo tsconfig.json



o ajustar la configuración como types



, typeRoots



o paths



.



5.5. Ejecutando un tsc



Los usuarios a menudo experimentan un rendimiento deficiente con herramientas de compilación de terceros como Gulp, Rollup, Webpack, etc. Ejecutar tsc --extendedDiagnostics



para encontrar discrepancias importantes entre TypeScript y una herramienta de terceros puede indicar errores en la configuración externa o ineficiencia.



Lo que necesitas preguntarte:



  • ¿Existe una gran diferencia en los tiempos de compilación tsc



    con la herramienta integrada TypeScript?
  • Si la herramienta de terceros tiene herramientas de diagnóstico, ¿la solución es diferente entre TypeScript y la herramienta de terceros?
  • ¿Tiene la herramienta su propia configuración que podría estar provocando un rendimiento deficiente?
  • ¿La herramienta tiene una configuración para integrarla con TypeScript que podría estar causando un rendimiento deficiente (como opciones para ts-loader)?


5.6. Actualizar dependencias



A veces, los archivos computacionalmente complejos pueden afectar la verificación de tipos en TypeScript .d.ts



. Rara vez, pero sucede. Esto generalmente se resuelve actualizando a una versión más reciente de TypeScript (de manera más eficiente) o una versión más nueva del paquete @types



(que podría revertir la regresión).



6. Problemas frecuentes



Cuando se enfrente a dificultades, querrá aprender sobre soluciones a problemas comunes. Si lo siguiente no ayuda, puede informar el problema .



6.1. Incluir y excluir configurados incorrectamente



Como se mencionó, las opciones include



/ se exclude



pueden usar incorrectamente.



Problema Porque Corrección
node_modules



se agregó accidentalmente desde una subcarpeta más profunda.
No estaba configurado exclude



"exclude": ["**/node_modules", "**/.*/"]





node_modules



se agregó accidentalmente desde una subcarpeta más profunda.
"exclude": ["node_modules"]





"exclude": ["**/node_modules", "**/.*/"]





Los archivos ocultos con un punto se agregan aleatoriamente (por ejemplo .git



).
"exclude": ["**/node_modules"]





"exclude": ["**/node_modules", "**/.*/"]





Se agregaron archivos inesperados. No estaba configurado include



"include": ["src"]







7. Completar informes de problemas



Si su proyecto ya está configurado de manera correcta y óptima, puede completar un informe de problemas .



Un buen informe contiene una descripción fácil de seguir del problema. Es decir, contiene una base de código de varios archivos que se pueden clonar fácilmente a través de Git. En este caso, no hay necesidad de integración externa con herramientas de ensamblaje, se puede llamar a través de ellas tsc



o puede usar código de espacio aislado que usa la API de TypeScript. No puede priorizar bases de código que requieran configuraciones y llamadas complejas.



Sí, esto no siempre es fácil de lograr. Especialmente porque es difícil aislar la fuente del problema dentro del código base, y también existen consideraciones de protección de la propiedad intelectual. En algunos casos, puede enviarnos un NDA si cree que el problema es de gran importancia.



Independientemente de la reproducibilidad del problema, al completar el informe, siga estos consejos, que nos ayudarán a encontrar una solución.



7.1. Informe de problemas de rendimiento del compilador



Ocasionalmente, se producen problemas de rendimiento durante la compilación y la edición. Entonces tiene sentido centrarse en el compilador de TypeScript.



Primero, use la versión "nocturna" de TypeScript para asegurarse de que no se encuentre con un problema resuelto:



npm install --save-dev typescript@next

# or

yarn add typescript@next --dev

      
      





La descripción del problema de rendimiento debe incluir:



  • Versión instalada de TypeScript ( npx tsc -v



    o yarn tsc -v



    ).
  • La versión de Node en la que se estaba ejecutando TypeScript ( node -v



    ).
  • Resultado de ejecutar con la opción extendedDiagnostics



    ( tsc --extendedDiagnostics -p tsconfig.json



    ).
  • Idealmente, el proyecto en sí es necesario para demostrar el problema en cuestión.
  • Registro del generador de perfiles del compilador (archivos isolate-*-*-*.log



    y *.cpuprofile



    ).


Perfilado del compilador



Es importante proporcionarnos un seguimiento de diagnóstico ejecutando Node.js v10 + con la bandera --trace-ic



y TypeScript con la bandera --generateCpuProfile



:



node --trace-ic ./node_modules/typescript/lib/tsc.js --generateCpuProfile profile.cpuprofile -p tsconfig.json

      
      





Esto ./node_modules/typescript/lib/tsc.js



se puede reemplazar por cualquier ruta en la que esté instalada su versión del compilador de TypeScript. Y en su lugar tsconfig.json



puede ser cualquier archivo de configuración de TypeScript. En su lugar profile.cpuprofile



, el archivo de salida de su elección.



Se generarán dos archivos:



  • --trace-ic



    guardará los datos en un archivo de vista isolate-*-*-*.log



    (por ejemplo isolate-00000176DB2DF130-17676-v8.log



    ).
  • --generateCpuProfile



    guardará los datos en un archivo con el nombre de su elección. En el ejemplo anterior, esto es profile.cpuprofile



    .


Nota : Estos archivos pueden contener información de su espacio de trabajo, incluidas rutas y código fuente. Ambos archivos se crean en texto sin formato y puede editarlos antes de adjuntarlos al informe de Github (por ejemplo, eliminando las rutas que podrían revelar información confidencial).



Pero si tienes alguna duda sobre ponerlas en Github, escríbenos y podrás enviarnos la información de forma privada.



7.2. Problemas de rendimiento del editor de informes



Puede haber muchas razones para un rendimiento de edición deficiente. Y el equipo de TypeScript solo puede afectar el rendimiento del servicio de lenguaje JavaScript / TypeScript, así como la integración entre el servicio de lenguaje y ciertos editores (como Visual Studio, Visual Studio Code, Visual Studio para Mac y Sublime Text). Asegúrese de que todos los complementos de terceros estén deshabilitados en su editor. Esto garantizará que el problema esté relacionado con el propio TypeScript.



Los problemas de rendimiento del editor son un poco más complejos, pero se aplican las mismas ideas: las bases de código mínimas clonadas con un problema reproducible son ideales. Y en algunos casos, podemos firmar un acuerdo de confidencialidad para investigar y aislar problemas.



Añadiendo datos detsc --extendedDiagnostics



, pero aún mejor si hay un rastro de TSServer.



Obtener registros de TSServer en Visual Studio Code



  1. Abra la barra de comandos, luego:
  2. Configure la opción «typescript.tsserver.log»: «verbose»,



    .
  3. Reinicie VS Code y reproduzca el problema.
  4. En VS Code, ejecute el comando TypeScript: Open TS Server log



    .
  5. El archivo debería abrirse tsserver.log



    .


Nota : El registro de TSServer puede contener información de su espacio de trabajo, incluidas rutas y código fuente. Si tienes alguna duda sobre ponerlo en Github, escríbenos y podrás enviarnos la información en privado.



All Articles