Описание бага
Встречается в пакетах, где есть обращение к window.__NEXT_DATA__
По дефолту у window нету свойства __NEXT_DATA__
, так что нам нужно его туда добавить
Проблема встречалась и ранее, так что вот полная хронология:
Начальное состояние
Изначально эта проблема решалась так:
declare global {
interface Window {
__NEXT_DATA__: any
}
}
Все было нормально до того момента, пока мы не обновили typescript до 4 мажорной. Ошибка выглядела так:
Type error: Subsequent property declarations must have the same type. Property '__NEXT_DATA__' must be of type 'NEXT_DATA', but here has type 'any'.
3 | declare global {
4 | interface Window {
> 5 | __NEXT_DATA__: any;
| ^
6 | }
7 | }
8 | declare type Props = {
Воспроизведение:
Для воспроизведение можно использовать @monstrs/[email protected]
, там такая же проблема (с ходу не нашел @atls
либ более ранних версий в регистре, где бы это воспроизводилось)
Нужно установить ее в проект с [email protected]
и запустить typecheck (но само приложение будет работать)
"Фикс"
Для фикса этой проблемы, очевидно, нужно было получить тип NEXT_DATA, о котором он писал в логах, и он должен был находиться в где-то next, но проблема в том, что просто так его взять и заимпортить нельзя - его нет в индексе.
Проблема решается если добираться до файла с этим типом вручную через релятивные пути:
require('next/dist/next-server/lib/utils')
Там есть NEXT_DATA и он нам подходит, но проблема в том, что в разных версиях некста путь до этого файла тоже разный, так что была использована следующая заплатка (на данный момент актуальная):
const NEXT_DATA_VAL = (require('next/dist/shared/lib/utils') || require('next/dist/next-server/lib/utils')).NEXT_DATA
type NEXT_DATA = typeof NEXT_DATA_VAL
declare global {
interface Window {
__NEXT_DATA__: NEXT_DATA
}
}
Ранее она работала, но здесь она выстрелила следующим образом:
Только в этом случае уже не билдится проект: он не может достучаться до файла, откуда мы берем NEXT_DATA
Воспроизведение
Получается шаги для воспроизведения бага следующие:
- Устанавливаем на проекте
@atls/[email protected]
и next@11
или [email protected]
(проверялось на обоих)
- Билдим проект
- Видим ошибку
Но проблема в том, что есть проекты где с аналогичным окружением все в порядке, так что шаги могут сработать, а могут и не сработать, на данный момент не могу быть уверен в чем именно причина
Ожидаемое поведение
Тайпчеки проходят, проект билдится
Данные окружения
- macOS@monterey и Windows 10