Problema: estou trabalhando em um arquivo que possui muitos tipos condicionais que derivam seus tipos de tipos condicionais definidos anteriormente e isso se tornou muito complexo e difícil de depurar como um tipo está sendo derivado.
Estou tentando encontrar uma maneira de "depurar" ou listar como o compilador TypeScript está determinando um tipo condicional e escolhendo um caminho para derivar o tipo final.
Examinei as opções do compilador e ainda não encontrei nada nessa área ...
Uma analogia com o que estou procurando agora é o equivalente ao DEBUG=express:*
tipo de configuração que se pode usar se você quiser ver o que um servidor expresso está fazendo.
No entanto, o problema real que estou tentando resolver é ser capaz de desconstruir e depurar como um tipo é derivado em uma definição de tipo hierárquica complexa e grande.
Nota importante: Não estou tentando depurar a execução em tempo de execução do projeto TypeScript. Estou tentando depurar como os tipos são calculados pelo compilador TypeScript.
interface
com um nome de contêiner auto-documentável em vez de um genéricotype
que tenta expandir sua definição na dica de ferramenta do IDE) ou apenas refatorar a fonte para evitar o uso excessivo de tipos condicionais complexos.Respostas:
Não há nenhum mecanismo interno no texto datilografado para desconectar as informações desejadas em questão. No entanto, se você estiver interessado em entender o trabalho interno, aqui está o código-fonte onde a resolução real dos tipos condicionais acontece.
Dê uma olhada nesses lugares em
checker.ts
.ln: 13258
instantiateTypeWorker()
ln: 12303
getConditionalType()
ln: 12385
getTypeFromConditionalTypeNode()
ln: 12772
getTypeFromTypeNode()
Em anexo está um plug-in datilografado pela metade que montei descuidadamente. Ele efetua logout da estrutura de dados brutos de a
ConditionalType
. Para entender essa estrutura, verifique types.ts ln: 4634.O UX deste plugin é terrível, mas essa estrutura diz como o texto datilografado decide o valor final de um tipo condicional.
Mostrar snippet de código
Algumas instruções irritantemente detalhadas para executar este plugin:
mkdir my-ts-plugin && cd my-ts-plugin
touch package.json
e escreva{ "name": "my-ts-plugin", "main": "index.js" }
yarn add typescript fast-safe-stringify
index.ts
, use tsc para compilá-lo paraindex.js
yarn link
cd
no diretório do seu próprio projeto ts, executeyarn link my-ts-plugin
{ "compilerOptions": { "plugins": [{ "name": "my-ts-plugin" }] } }
ao seutsconfig.json
(.vscode/settings.json)
esta linha:{ "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"
, agora abra um arquivo de código ts e passe o mouse para algum nó do tipo condicional; você verá uma estrutura de dados json muito mais adicionada ao arquivo de log.fonte
debugger
pausa em algum lugar e depois procurar manualmente os escopos locais nas pilhas de chamadas.getConditionalType()
inchecker.ts
para criar um texto datilografado de compilação personalizado, inserindo alguma lógica de efeito colateral para despejar informações intermediárias ao longo do caminho. E desta vez consegui algo um pouco mais útil. Vou limpar meu código e anexar uma essência mais tarde.