Как я могу увидеть, как TypeScript вычисляет типы?

18

Проблема: я работаю над файлом, который имеет много условных типов, которые получают свои типы из ранее определенных условных типов, и это стало очень сложным и трудным для отладки того, как выводится тип.

Я пытаюсь найти способ «отладки» или перечислить, как компилятор TypeScript делает свой выбор по условному типу и выбирает путь для получения окончательного типа.

Я просмотрел параметры компилятора и пока не нашел ничего в этой области ...

Аналогия с тем, что я сейчас ищу, является эквивалентом DEBUG=express:*типа настроек, который можно использовать, если вы хотите увидеть, что делает экспресс-сервер.

Тем не менее, реальная проблема, которую я пытаюсь решить, заключается в том, чтобы иметь возможность деконструировать и отлаживать способ получения типа в большом сложном иерархическом определении типа.

Важное примечание: я не пытаюсь отладить выполнение во время выполнения проекта TypeScript. Я пытаюсь отладить, как типы вычисляются компилятором TypeScript.

парень
источник
Просто используйте хорошую IDE, создайте экземпляр вашего типа и наведите курсор на значение в исходном файле, открытом в вашем редакторе. Есть ли какая-то дополнительная информация, которую вы упускаете, используя это предложение?
Патрик Робертс
@PatrickRoberts - спасибо за ответ. Когда я это делаю, это указывает на сложный тип, который имеет вложенные условные типы. Это, в свою очередь, указывает на другой подобный сложный тип, и он продолжает идти, и иногда он будет разветвляться неочевидным образом. Попытка выяснить, как отладить, почему происходит эта ветвь конструирования типа.
Парень
1
Я думаю, что ваш вопрос выиграет от конкретного примера, чтобы продемонстрировать это. Я также сталкивался с ситуацией, которую вы описывали ранее, но обычно я нахожу обходной путь, переписывающий типы так, чтобы они были либо более непрозрачными (например, универсальный interfaceс самодокументируемым именем контейнера вместо универсального, typeкоторый пытается расширить его). определение в подсказке IDE) или просто рефакторинг источника, чтобы полностью избежать чрезмерного использования сложных условных типов.
Патрик Робертс
@PatrickRoberts пытается обновить этот репозиторий до Hapi / Joi @ 16 и отлаживать генерацию типов - вот что приводит к этому вопросу. github.com/TCMiranda/joi-extract-type
Парень
@PatrickRoberts - это конкретная проблема, обсуждающая само обновление для контекста. github.com/TCMiranda/joi-extract-type/issues/22
Парень

Ответы:

1

В машинописи нет встроенного механизма для выхода из нужной информации. Однако, если вы заинтересованы в понимании внутренней работы, вот место в исходном коде, где происходит фактическое разрешение условных типов.

Взгляните на эти места в checker.ts.

Инн instantiateTypeWorker()
: 13258 Инн getConditionalType()
: 12303 Инн getTypeFromConditionalTypeNode()
: 12385 Инн : 12772getTypeFromTypeNode()


Прикрепленный наполовину готовый плагин для машинописи, который я небрежно собрал. Это выходит из необработанной структуры данных ConditionalType. Чтобы понять эту структуру, проверьте types.ts ln: 4634.

UX этого плагина ужасен, но эта структура говорит вам, как машинопись решает окончательное значение условного типа.

Несколько досадных подробных инструкций по запуску этого плагина:

  1. mkdir my-ts-plugin && cd my-ts-plugin
  2. touch package.json и писать { "name": "my-ts-plugin", "main": "index.js" }
  3. yarn add typescript fast-safe-stringify
  4. скопируйте и вставьте этот фрагмент в index.ts, используйте tsc, чтобы скомпилировать его вindex.js
  5. yarn link
  6. теперь cdк вашему собственному проекту ts, запуститеyarn link my-ts-plugin
  7. добавить { "compilerOptions": { "plugins": [{ "name": "my-ts-plugin" }] } }к вашемуtsconfig.json
  8. добавить в рабочее пространство, установив (.vscode/settings.json)эту строку:{ "typescript.tsdk": "<PATH_TO_YOUR_TS_PROJECT>/node_modules/typescript/lib" }
  9. откройте палитру команд vscode и запустите:
    1. TypeScript: Select TypeScript Version... -> Use Workspace Version
    2. TypeScript: Restart TS Server
    3. TypeScript: Open TS Server Log
  10. вы должны увидеть, как плагин вышел из системы "PLUGIN UP AND RUNNING", теперь откройте файл кода ts и наведите указатель мыши на какой-нибудь узел условного типа, вы увидите, что в файл журнала добавлена ​​зацикленная структура данных json.
hackape
источник
Спасибо за это @hackape. Я взломал его и могу создать несколько интересных журналов, которые в значительной степени содержат список того, что я вижу в интерактивном режиме при использовании VSCode, поэтому он не продвинул меня дальше, чем я был. Хорошие инструкции о том, как заставить этот плагин работать.
Парень
Я дал вам награду. Несмотря на то, что это не привело меня к решению, я думаю, что, приложив больше усилий для модификации этого плагина, я, вероятно, смогу туда добраться и не могу представить, что в ближайшем будущем будет лучшее решение. Спасибо за вашу помощь и усилия!
Парень
1
@Guy Спасибо за награду. Поэтому вчера я провел еще пару часов, пытаясь получить более полезный результат. Вы правы. Приведенная выше структура данных захватывает объект AST-ish цепочки условных типов, но это просто проанализированный результат, а не оцененный результат. Что касается «почему» или какой условной ветви, которую использует распознаватель типов при оценке, то для этого требуется выгрузить результаты всех промежуточных шагов, что-то вроде debuggerприостановки где-то, а затем ручного просмотра локальных областей в стеках вызовов.
hackape
1
Я изменил getConditionalType()ин , checker.tsчтобы сделать заказ сборку машинописи, вставив некоторый побочный эффект логик выливать промежуточную информацию по пути. И на этот раз я получил что-то более полезное. Я уберу свой код и приложу суть позже.
hackape
1
@ Слушай, суть здесь
хакпэ