Назад

Что если сделать ссылочную стабильность частью системы типов TypeScript?

Концепция stableref: брендированные Stable-типы, строгие пропсы и хуки для проверки стабильных ссылок на этапе компиляции.

Что если сделать ссылочную стабильность частью системы типов TypeScript?

Главная боль при работе с React.memo, useCallback или useMemo — их вычисления ломаются тихо и незаметно. Достаточно прокинуть в пропсы инлайн-массив [1, 2, 3] или обычную стрелочную функцию, как ссылочная целостность рушится, мемоизация слетает, а компонент начинает рендериться на каждый чих родителя.

При этом TypeScript молчит: с точки зрения стандартной системы типов инлайн-массив ничем не отличается от массива, обёрнутого в useMemo.

Джови де Крук (Jovi DeCroock) задался вопросом: «А что, если закодировать правила ссылочной стабильности фреймворка прямо в типы?» И выкатил классную концептуальную библиотеку stableref.

Как это работает:

  • Branded Types: Вводятся брендированные типы вроде Stable<T>, определяющие ссылку как гарантированно стабильную между рендерами.
  • Жесткая типизация пропсов: Если мемоизированный компонент требует Stable<Item[]>, прокинуть туда обычный массив [1, 2] не получится — TypeScript сразу выбросит Type Error строго на этапе компиляции.
  • Рантайм без сюрпризов: Больше не нужно с профилировщиком в DevTools ловить причины постоянных перерисовок — ошибки нестабильных ссылок подсвечиваются прямо в IDE в момент написания кода.
  • Хуки-обёртки: Кастомные useCallback и useMemo из библиотеки возвращают именно Stable-ссылки, которые и запрашивает компонент.

По сути, это попытка переложить контроль за мемоизацией с рантайма на статическую проверку типов.

Читать подробный разбор у автора

Как вам идея? Затащили бы такие строгие проверки ссылок в свои TS-проекты или React Compiler / компиляция фреймворков в итоге полностью закроют эту боль?

Скопировано