Як я бачу, як 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/isissue/22
Хлопець

Відповіді:


1

Немає вбудованого механізму в машинопис, щоб вийти з потрібної інформації. Однак якщо ви зацікавлені в розумінні внутрішньої роботи, ось місце у вихідному коді, де відбувається фактичне розв'язання умовних типів.

Погляньте на ці місця в checker.ts.

ln: 13258 instantiateTypeWorker()
ln: 12303 getConditionalType()
ln: 12385 getTypeFromConditionalTypeNode()
ln: 12772getTypeFromTypeNode()


Доданий напівзроблений плагін друкарської машинки, який я недбало збираю. Він реєструє необроблену структуру даних ConditionalType. Щоб зрозуміти цю структуру, перевірте type.ts ln: 4634.

UX цього плагіна жахливий, але ця структура говорить вам про те, як typecript визначає кінцеве значення умовного типу.

Деякі дратівливі докладні інструкції для запуску цього плагіна:

  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 до компіляціїindex.js
  5. yarn link
  6. зараз cd до вашого власного проекту проекту, запустіть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 та наведіть курсор миші на якийсь вузол умовного типу, ви побачите структуру даних loooooong json, додану до файлу журналу.

Дякую за це @hackape. Я зламав з цим і можу створити кілька журналів, які цікаві і в значній мірі перелічують те, що я бачу в інтерактивному режимі під час використання VSCode, тому він не отримав мене набагато далі, ніж там, де я був. Хороші вказівки щодо роботи плагіна.
Хлопець

Я дарував вам нагороду. Навіть незважаючи на те, що мене це не знайшло, я думаю, що, доклавши більше зусиль, щоб змінити цей плагін, я, можливо, міг би потрапити туди, і не можу уявити, що є кращим рішенням цього питання найближчим часом. Дякуємо за вашу допомогу та зусилля!
Хлопець

1
@Guy Дякую за щедроту. Тому я вчора провів ще пару годин, намагаючись отримати корисніший результат. Ти правий. Структура даних вище зафіксує об'єкт AST-ish ланцюга умовного типу, але це лише проаналізований результат, а не оцінений результат. Щодо "чому" або до якої умовної гілки приймає розв'язувач типів під час оцінювання, він вимагає скидання результатів усіх проміжних кроків, на кшталт того, debuggerщоб ставити десь паузу, а потім вручну переглядати локальні області застосування в стеках викликів.
hackape

1
Я змінив функцію getConditionalType()in, checker.tsщоб створити власну машинопис типу збірки, вставивши деяку логіку побічних ефектів, щоб скинути проміжну інформацію по дорозі. І цього разу я отримав щось трохи корисніше. Я прибираю свій код і додаю суть пізніше.
хакапе

1
@Guy суть тут
hackape
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.