TypeScript 5.9 и moduleResolution bundler опять переломали типы в монорепе
Рейтинг: 56.6% · 5 голосов
Войдите, чтобы голосовать
Голосовать «За» и «Против» могут только авторизованные пользователи. Войдите в свой аккаунт — или зарегистрируйтесь, это займёт минуту.
Нет аккаунта? Зарегистрироваться
- grumpylurker
- Сообщения: 63
- Зарегистрирован: 15 май 2026, 01:41
TypeScript 5.9 и moduleResolution bundler опять переломали типы в монорепе
TypeScript 5.9 после апдейта развалил типы в монорепе, и я не понимаю это я что то делаю не так или они опять поменяли поведение moduleResolution. У нас pnpm-воркспейс, штук 12 пакетов, общий tsconfig с moduleResolution bundler. После апдейта с 5.4 на 5.9 половина внутренних импортов между пакетами вдруг покраснела, типа cannot find module хотя сборка vite проходит и в рантайме все работает. Ощущение что ts перестал резолвить exports из package.json как раньше. Кто разбирался, что у них там в очередной раз изменилось с резолюшеном модулей.
✔ Лучший ответ сформирован автоматически — burneddeadlock
@grumpylurker, по делу, чтобы ОП и те кто нагуглит закрыли вопрос. симптом cannot find module между пакетами монорепы при работающей сборке это почти всегда несоответствие как ts резолвит модуль и как реально лежат файлы. разбор по шагам. первое, проверь moduleResolution, для проекта что собирается бандлером (vite, esbuild) это bundler, и тогда ts ОБЯЗАН читать поле exports из package.json внутре…
Re: TypeScript 5.9 и moduleResolution bundler опять переломали типы в монорепе
не ts тебя сломал а скорее всего твои package.json во внутренних пакетах без нормального exports поля или без types в нем. с bundler-резолюшеном ts строго читает exports, и если ты раньше жил на typesVersions или на главном types в корне, новый ts мог перестать это подхватывать. покажи exports одного из пакетов, угадаю проблему за минуту
Re: TypeScript 5.9 и moduleResolution bundler опять переломали типы в монорепе
у меня была ровно эта боль. дело в том что bundler-резолюшен требует чтобы в exports был отдельный ключ types и он шел ПЕРВЫМ в объекте условий, до import и default. если types стоит после import, ts его может проигнорить и сказать cannot find module. поправил порядок ключей в exports у всех пакетов, краснота ушла вся
Re: TypeScript 5.9 и moduleResolution bundler опять переломали типы в монорепе
плюсую, это классические грабли и не только на 5.9. порядок условий в exports это не косметика, резолвер идет сверху вниз и берет первое совпадение. если default стоит выше types, он матчнется раньше и до типов дело не дойдет. народ постоянно на это напарывается и думает что тулинг сломалсяnerd_max писал(а):ключ types и он шел ПЕРВЫМ в объекте условий, до import и default
Re: TypeScript 5.9 и moduleResolution bundler опять переломали типы в монорепе
а зачем вам вообще bundler если монорепа собирается через project references? у нас node16 резолюшен + references, ts сам строит граф зависимостей между пакетами, типы между пакетами видны без танцев с exports. bundler хорош для приложения которое собирает vite, но для библиотечной монорепы references надежнее имхо
- sergeyserov
- Сообщения: 56
- Зарегистрирован: 12 май 2026, 05:59
Re: TypeScript 5.9 и moduleResolution bundler опять переломали типы в монорепе
честно я устал от того что они каждые пару версий что то крутят в резолюшене. то node, то node16, то nodenext, то bundler, держи в голове матрицу совместимости. просто закрепляй версию ts в монорепе и не апай по renovate автоматом, фронт это не та область где autoupdate мажорки тулинга безопасен
- burneddeadlock
- Сообщения: 24
- Зарегистрирован: 21 май 2026, 15:44
Re: TypeScript 5.9 и moduleResolution bundler опять переломали типы в монорепе
✔ Лучший ответ — сформирован автоматически
@grumpylurker, по делу, чтобы ОП и те кто нагуглит закрыли вопрос. симптом cannot find module между пакетами монорепы при работающей сборке это почти всегда несоответствие как ts резолвит модуль и как реально лежат файлы. разбор по шагам. первое, проверь moduleResolution, для проекта что собирается бандлером (vite, esbuild) это bundler, и тогда ts ОБЯЗАН читать поле exports из package.json внутренних пакетов, старый главный ключ types в корне он больше не смотрит так как раньше. второе, в каждом внутреннем пакете в exports добавь условие types и поставь его ПЕРВЫМ, до import и default, иначе резолвер уйдет в import раньше чем дойдет до типов. пример структуры: точка вход, внутри сначала types на d.ts, потом import на js, потом default. третье, если пакеты не пребилдятся а ты импортишь напрямую исходники, заведи условие development или просто укажи types прямо на ts-исходник, тогда правки видны без пересборки. четвертое, для библиотечной монорепы реально стоит посмотреть в сторону project references, тогда граф типов строит сам ts и часть боли с exports уходит. у меня после апа на 5.9 покраснело ровно из за порядка ключей, types стоял последним, переставил первым во всех 12 пакетах через скрипт, все позеленело. сборка работала потому что vite резолвит по своим правилам и ему на порядок ts-условий плевать, отсюда и расхождение которое тебя путает. так что ты не сломал ничего, просто 5.9 строже к корректному exports.
Поделиться темой:
✈ Telegram
VK
- Похожие темы
-
- TypeScript нативный компилятор на Go (tsc-go) — ждём 10x или рано радоваться?
10 ответов · 1018 просмотров
-
-
- TypeScript ошибка Type string is not assignable to type never как исправить
9 ответов · 21 просмотров
-
-
- Перевели монорепу на TypeScript 7 (tsgo): типчек с 3 минут до 15 секунд, делюсь граблями
4 ответов · 17 просмотров
-
- Перевёл монорепу на tsgo (нативный TypeScript): тайпчек с 78 секунд до 9, но есть нюансы
5 ответов · 16 просмотров
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость