Problema: estoy trabajando en un archivo que tiene muchos tipos condicionales que derivan sus tipos de tipos condicionales previamente definidos y esto se ha vuelto muy complejo y difícil de depurar cómo se deriva un tipo.
Estoy tratando de encontrar una manera de "depurar" o enumerar cómo el compilador de TypeScript está haciendo su determinación sobre un tipo condicional y seleccionando una ruta para derivar el tipo final.
He revisado las opciones del compilador y todavía no he encontrado nada en esa área ...
Una analogía con lo que estoy buscando en este momento es el equivalente del DEBUG=express:*
tipo de configuración que uno podría usar si quisiera ver lo que estaba haciendo un servidor express.
Sin embargo, el problema real que estoy tratando de resolver es poder deconstruir y depurar cómo se deriva un tipo en una definición de tipo jerárquica grande y compleja.
Nota importante: no estoy tratando de depurar la ejecución en tiempo de ejecución del proyecto TypeScript. Estoy tratando de depurar cómo los tipos son calculados por el compilador TypeScript.
interface
con un nombre de contenedor autodocumentado en lugar de un genéricotype
que intente expandir su definición en la información sobre herramientas del IDE) o simplemente refactorizando la fuente para evitar el uso excesivo de tipos condicionales complejos por completo.Respuestas:
No hay ningún mecanismo incorporado en mecanografiado para cerrar la información deseada en cuestión. Sin embargo, si está interesado en comprender el trabajo interno, este es el lugar en el código fuente donde ocurre la resolución real de los tipos condicionales.
Echa un vistazo a estos lugares en
checker.ts
.ln: 13258
instantiateTypeWorker()
ln: 12303
getConditionalType()
ln: 12385
getTypeFromConditionalTypeNode()
ln: 12772
getTypeFromTypeNode()
Adjunto hay un plugin mecanografiado a medio hacer que armé descuidadamente. Se desconecta la estructura de datos en bruto de a
ConditionalType
. Para entender esta estructura, verifique types.ts ln: 4634.La experiencia de usuario de este complemento es terrible, pero esa estructura le dice cómo el mecanografiado decide el valor final de un tipo condicional.
Mostrar fragmento de código
Algunas instrucciones molestas y detalladas para ejecutar este complemento:
mkdir my-ts-plugin && cd my-ts-plugin
touch package.json
y escribe{ "name": "my-ts-plugin", "main": "index.js" }
yarn add typescript fast-safe-stringify
index.ts
, usa tsc para compilarloindex.js
yarn link
cd
al directorio de tu propio proyecto ts, ejecutayarn link my-ts-plugin
{ "compilerOptions": { "plugins": [{ "name": "my-ts-plugin" }] } }
a sutsconfig.json
(.vscode/settings.json)
esta línea:{ "typescript.tsdk": "<PATH_TO_YOUR_TS_PROJECT>/node_modules/typescript/lib" }
TypeScript: Select TypeScript Version... -> Use Workspace Version
TypeScript: Restart TS Server
TypeScript: Open TS Server Log
"PLUGIN UP AND RUNNING"
, ahora abra un archivo de código ts y desplace el mouse hacia algún nodo de tipo condicional, debería ver una estructura de datos json muuuuuuuuuuuu larga agregada al archivo de registro.fuente
debugger
pausa en algún lugar y luego buscar manualmente los ámbitos locales en las pilas de llamadas.getConditionalType()
dechecker.ts
hacer un texto mecanografiado de generación personalizada, insertar alguna lógica efecto secundario a volcar información intermedia a lo largo del camino. Y esta vez obtuve algo un poco más útil. Limpiaré mi código y adjuntaré una idea más adelante.