Проблема: я работаю над файлом, который имеет много условных типов, которые получают свои типы из ранее определенных условных типов, и это стало очень сложным и трудным для отладки того, как выводится тип.
Я пытаюсь найти способ «отладки» или перечислить, как компилятор TypeScript делает свой выбор по условному типу и выбирает путь для получения окончательного типа.
Я просмотрел параметры компилятора и пока не нашел ничего в этой области ...
Аналогия с тем, что я сейчас ищу, является эквивалентом DEBUG=express:*
типа настроек, который можно использовать, если вы хотите увидеть, что делает экспресс-сервер.
Тем не менее, реальная проблема, которую я пытаюсь решить, заключается в том, чтобы иметь возможность деконструировать и отлаживать способ получения типа в большом сложном иерархическом определении типа.
Важное примечание: я не пытаюсь отладить выполнение во время выполнения проекта TypeScript. Я пытаюсь отладить, как типы вычисляются компилятором TypeScript.
interface
с самодокументируемым именем контейнера вместо универсального,type
который пытается расширить его). определение в подсказке IDE) или просто рефакторинг источника, чтобы полностью избежать чрезмерного использования сложных условных типов.Ответы:
В машинописи нет встроенного механизма для выхода из нужной информации. Однако, если вы заинтересованы в понимании внутренней работы, вот место в исходном коде, где происходит фактическое разрешение условных типов.
Взгляните на эти места в
checker.ts
.Инн
instantiateTypeWorker()
: 13258 Инн
getConditionalType()
: 12303 Инн
getTypeFromConditionalTypeNode()
: 12385 Инн : 12772
getTypeFromTypeNode()
Прикрепленный наполовину готовый плагин для машинописи, который я небрежно собрал. Это выходит из необработанной структуры данных
ConditionalType
. Чтобы понять эту структуру, проверьте types.ts ln: 4634.UX этого плагина ужасен, но эта структура говорит вам, как машинопись решает окончательное значение условного типа.
Показать фрагмент кода
Несколько досадных подробных инструкций по запуску этого плагина:
mkdir my-ts-plugin && cd my-ts-plugin
touch package.json
и писать{ "name": "my-ts-plugin", "main": "index.js" }
yarn add typescript fast-safe-stringify
index.ts
, используйте tsc, чтобы скомпилировать его вindex.js
yarn link
cd
к вашему собственному проекту ts, запуститеyarn link my-ts-plugin
{ "compilerOptions": { "plugins": [{ "name": "my-ts-plugin" }] } }
к вашемуtsconfig.json
(.vscode/settings.json)
эту строку:{ "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"
, теперь откройте файл кода ts и наведите указатель мыши на какой-нибудь узел условного типа, вы увидите, что в файл журнала добавлена зацикленная структура данных json.источник
debugger
приостановки где-то, а затем ручного просмотра локальных областей в стеках вызовов.getConditionalType()
ин ,checker.ts
чтобы сделать заказ сборку машинописи, вставив некоторый побочный эффект логик выливать промежуточную информацию по пути. И на этот раз я получил что-то более полезное. Я уберу свой код и приложу суть позже.