Middle JavaScript и React
Экспресс-шпаргалка 20/20
- React сравнивает предыдущее и новое virtual DOM дерево и применяет в real DOM только минимально необходимые изменения.
keyнужен, чтобы React стабильно идентифицировал элементы между рендерами и корректно обновлял список.- В зависимости нужно включать все внешние значения, которые используются внутри effect, чтобы избежать stale данных.
- Они полезны, когда есть измеримая проблема производительности: дорогие вычисления или лишние ререндеры из-за нестабильных ссылок.
- Контролируемая форма хранит значение в state, неконтролируемая — в DOM через ref.
- State поднимают к ближайшему общему родителю, если нескольким компонентам нужны одни и те же данные.
- При изменении value контекста все подписанные потребители могут перерендериться.
- Error Boundary ловит ошибки рендера в дочернем дереве React-компонентов и показывает fallback UI.
- Для code splitting и отложенной загрузки тяжелых частей интерфейса.
- Нестабильные props (функции/объекты), слишком высокий state, изменения контекста и отсутствие мемоизации в нужных местах.
- CSR рендерит в браузере, SSR рендерит HTML на сервере на каждый запрос, SSG генерирует HTML заранее на этапе сборки.
- Hydration mismatch — несоответствие между HTML с сервера и первым рендером клиента.
- Оба описывают форму данных, но
interfaceпроще расширять через declaration merging, аtypeгибче для union/intersection и утилитарных комбинаций. - Generics позволяют писать переиспользуемые функции/типы с сохранением строгой типизации.
- Это union объектов с общим дискриминатором (например,
type), который позволяет TypeScript безопасно сужать тип. - Чаще всего
Partial,Pick,Omit,Record,Readonly,ReturnType. Promise.allпадает на первой ошибке,Promise.allSettledдожидается завершения всех промисов и возвращает статус каждого.AbortControllerпозволяет отменятьfetchи другие abortable операции, чтобы не держать лишние запросы и состояния.- Это обработка событий на общем родителе вместо подписки на каждый дочерний элемент.
- Tree shaking удаляет неиспользуемые экспорты из бандла, если код и сборка позволяют это статически определить.
1. Как работает reconciliation в React?
Теги: react, reconciliation, rendering, performance
Сложность: Middle
Короткий ответ
React сравнивает предыдущее и новое virtual DOM дерево и применяет в real DOM только минимально необходимые изменения.
Что сказать на интервью (30-60 секунд)
- Где это применяется: В производительности интерфейса: рендер, загрузка ассетов, отзывчивость и стабильность UX.
- Главный риск: Неправильная реализация дает лишние ререндеры, рост LCP/TTI и деградацию пользовательского пути.
- Как проверяете решение: Снимаю baseline в профайлере/DevTools, применяю изменение и подтверждаю эффект по LCP/INP/CPU time.
Мини-пример
items.map(item => <Row key={item.id} item={item} />);
Углубление (2-3 минуты)
- Свяжите тему "Как работает reconciliation в React?" с одним production-сценарием и объясните, почему она влияет на результат.
- Сравните поведение на быстром и медленном устройстве/сети.
- Зафиксируйте, какой компромисс вы принимаете и как защитите решение на интервью.
Типичные ошибки
- Переусложняют мемоизацию там, где нет измеримой проблемы.
- Оптимизируют без baseline-метрик и не понимают реальный эффект.
- Путают соседние концепции и не обозначают границы применимости выбранного подхода.
Follow-up вопросы
- Как будете валидировать эффект на медленных устройствах?
- Как эта тема влияет на LCP/INP/CLS в реальном интерфейсе?
- Какой минимальный тест или проверка подтвердит, что решение действительно работает?
Что повторить
- Профилирование рендера до/после изменения.
- Границы
SSR/CSR/SSG/ISR(если применимо). - Пройдите 2-3 связных вопроса в Банке вопросов и проверьте устойчивость ответа.
Связанные модули и карта
2. Зачем нужен key в списках?
Теги: react, key, lists, state-preservation
Сложность: Middle
Короткий ответ
key нужен, чтобы React стабильно идентифицировал элементы между рендерами и корректно обновлял список.
Что сказать на интервью (30-60 секунд)
- Где это применяется: В производительности интерфейса: рендер, загрузка ассетов, отзывчивость и стабильность UX.
- Главный риск: Неправильная реализация дает лишние ререндеры, рост LCP/TTI и деградацию пользовательского пути.
- Как проверяете решение: Проверяю целевой сценарий под slow network/CPU throttling и подтверждаю улучшение цифрами, а не ощущением.
Мини-пример
todos.map(todo => <Todo key={todo.id} todo={todo} />);
Углубление (2-3 минуты)
- Свяжите тему "Зачем нужен
keyв списках?" с одним production-сценарием и объясните, почему она влияет на результат. - Покажите, как изменение влияет на рендер и стоимость JavaScript.
- Зафиксируйте, какой компромисс вы принимаете и как защитите решение на интервью.
Типичные ошибки
- Оптимизируют без baseline-метрик и не понимают реальный эффект.
- Переусложняют мемоизацию там, где нет измеримой проблемы.
- Путают соседние концепции и не обозначают границы применимости выбранного подхода.
Follow-up вопросы
- Как будете валидировать эффект на медленных устройствах?
- Что выберете: простоту кода или оптимизацию, и по какому критерию?
- Какой минимальный тест или проверка подтвердит, что решение действительно работает?
Что повторить
- Критический путь рендера и метрики
LCP/INP/CLS. - Границы
SSR/CSR/SSG/ISR(если применимо). - Пройдите 2-3 связных вопроса в Банке вопросов и проверьте устойчивость ответа.
Связанные модули и карта
3. Как правильно работать с зависимостями в useEffect?
Теги: react, useeffect, dependencies, async
Сложность: Middle
Короткий ответ
В зависимости нужно включать все внешние значения, которые используются внутри effect, чтобы избежать stale данных.
Что сказать на интервью (30-60 секунд)
- Где это применяется: В производительности интерфейса: рендер, загрузка ассетов, отзывчивость и стабильность UX.
- Главный риск: Неправильная реализация дает лишние ререндеры, рост LCP/TTI и деградацию пользовательского пути.
- Как проверяете решение: Делаю воспроизводимый сценарий гонки/таймаута, добавляю логи порядка событий и проверяю стабильность в серии прогонов.
Мини-пример
useEffect(() => {
fetchUser(userId);
}, [userId]);
Углубление (2-3 минуты)
- Свяжите тему "Как правильно работать с зависимостями в
useEffect?" с одним production-сценарием и объясните, почему она влияет на результат. - Покажите, как тема влияет на race conditions, отмену операций и устойчивость состояния.
- Зафиксируйте, какой компромисс вы принимаете и как защитите решение на интервью.
Типичные ошибки
- Игнорируют отмену, таймауты и повторные запросы, из-за чего появляются race conditions.
- Не учитывают поведение при ошибках внешних сервисов.
- Путают соседние концепции и не обозначают границы применимости выбранного подхода.
Follow-up вопросы
- Где поставите retry, а где запретите его и почему?
- Что изменится в поведении при таймауте внешнего сервиса?
- Какой минимальный тест или проверка подтвердит, что решение действительно работает?
Что повторить
- Стратегии timeout, retry, cancellation и их ограничения.
- Метрики latency/error-rate на целевом сценарии.
- Пройдите 2-3 связных вопроса в Банке вопросов и проверьте устойчивость ответа.
Связанные модули и карта
4. Когда useMemo и useCallback реально полезны?
Теги: react, usememo, usecallback, optimization
Сложность: Middle
Короткий ответ
Они полезны, когда есть измеримая проблема производительности: дорогие вычисления или лишние ререндеры из-за нестабильных ссылок.
Что сказать на интервью (30-60 секунд)
- Где это применяется: В производительности интерфейса: рендер, загрузка ассетов, отзывчивость и стабильность UX.
- Главный риск: Неправильная реализация дает лишние ререндеры, рост LCP/TTI и деградацию пользовательского пути.
- Как проверяете решение: Сравниваю flamegraph и пользовательские метрики до/после, затем фиксирую guard-тест от регрессии.
Мини-пример
const filtered = useMemo(() => heavyFilter(items, query), [items, query]);
const onSelect = useCallback(id => setSelected(id), []);
Углубление (2-3 минуты)
- Свяжите тему "Когда
useMemoиuseCallbackреально полезны?" с одним production-сценарием и объясните, почему она влияет на результат. - Опишите влияние темы на user-centric метрики (
LCP,INP,CLS) и perceived performance. - Зафиксируйте, какой компромисс вы принимаете и как защитите решение на интервью.
Типичные ошибки
- Не проверяют сценарий на медленных устройствах и сетях.
- Оптимизируют без baseline-метрик и не понимают реальный эффект.
- Путают соседние концепции и не обозначают границы применимости выбранного подхода.
Follow-up вопросы
- Как эта тема влияет на LCP/INP/CLS в реальном интерфейсе?
- Как будете валидировать эффект на медленных устройствах?
- Какой минимальный тест или проверка подтвердит, что решение действительно работает?
Что повторить
- Профилирование рендера до/после изменения.
- Критический путь рендера и метрики
LCP/INP/CLS. - Пройдите 2-3 связных вопроса в Банке вопросов и проверьте устойчивость ответа.
Связанные модули и карта
5. Контролируемые и неконтролируемые формы в React?
Теги: react, forms, controlled-uncontrolled, validation
Сложность: Middle
Короткий ответ
Контролируемая форма хранит значение в state, неконтролируемая — в DOM через ref.
Что сказать на интервью (30-60 секунд)
- Где это применяется: В производительности интерфейса: рендер, загрузка ассетов, отзывчивость и стабильность UX.
- Главный риск: Неправильная реализация дает лишние ререндеры, рост LCP/TTI и деградацию пользовательского пути.
- Как проверяете решение: Проверяю целевой сценарий под slow network/CPU throttling и подтверждаю улучшение цифрами, а не ощущением.
Мини-пример
<input value={name} onChange={e => setName(e.target.value)} />
Углубление (2-3 минуты)
- Свяжите тему "Контролируемые и неконтролируемые формы в React?" с одним production-сценарием и объясните, почему она влияет на результат.
- Сравните поведение на быстром и медленном устройстве/сети.
- Зафиксируйте, какой компромисс вы принимаете и как защитите решение на интервью.
Типичные ошибки
- Оптимизируют без baseline-метрик и не понимают реальный эффект.
- Не проверяют сценарий на медленных устройствах и сетях.
- Путают соседние концепции и не обозначают границы применимости выбранного подхода.
Follow-up вопросы
- Как эта тема влияет на LCP/INP/CLS в реальном интерфейсе?
- Что выберете: простоту кода или оптимизацию, и по какому критерию?
- Какой минимальный тест или проверка подтвердит, что решение действительно работает?
Что повторить
- Границы
SSR/CSR/SSG/ISR(если применимо). - Критический путь рендера и метрики
LCP/INP/CLS. - Пройдите 2-3 связных вопроса в Банке вопросов и проверьте устойчивость ответа.
Связанные модули и карта
6. Когда поднимать state вверх (lifting state up)?
Теги: react, state-management, lifting-state, architecture
Сложность: Middle
Короткий ответ
State поднимают к ближайшему общему родителю, если нескольким компонентам нужны одни и те же данные.
Что сказать на интервью (30-60 секунд)
- Где это применяется: В производительности интерфейса: рендер, загрузка ассетов, отзывчивость и стабильность UX.
- Главный риск: Неправильная реализация дает лишние ререндеры, рост LCP/TTI и деградацию пользовательского пути.
- Как проверяете решение: Оформляю решение через ADR, затем проверяю ключевой trade-off на прототипе и эксплуатационных метриках.
Мини-пример
// Parent хранит selectedId и передает вниз в List и Details
Углубление (2-3 минуты)
- Свяжите тему "Когда поднимать state вверх (lifting state up)?" с одним production-сценарием и объясните, почему она влияет на результат.
- Опишите, какие решения документируете в
ADRи почему. - Зафиксируйте, какой компромисс вы принимаете и как защитите решение на интервью.
Типичные ошибки
- Смешивают границы модулей и получают высокий coupling.
- Оптимизируют локально, ухудшая глобальную архитектуру.
- Путают соседние концепции и не обозначают границы применимости выбранного подхода.
Follow-up вопросы
- Где проходит boundary между модулями в этом кейсе?
- Какое решение вы зафиксируете в ADR и какие альтернативы отвергнете?
- Какой минимальный тест или проверка подтвердит, что решение действительно работает?
Что повторить
- Артефакт
ADRили эквивалентный документ решения. - Dependency map и границы ownership.
- Пройдите 2-3 связных вопроса в Банке вопросов и проверьте устойчивость ответа.
Связанные модули и карта
7. Какие проблемы у Context API по производительности?
Теги: react, context-api, performance, state
Сложность: Middle
Короткий ответ
При изменении value контекста все подписанные потребители могут перерендериться.
Что сказать на интервью (30-60 секунд)
- Где это применяется: В производительности интерфейса: рендер, загрузка ассетов, отзывчивость и стабильность UX.
- Главный риск: Неправильная реализация дает лишние ререндеры, рост LCP/TTI и деградацию пользовательского пути.
- Как проверяете решение: Снимаю baseline в профайлере/DevTools, применяю изменение и подтверждаю эффект по LCP/INP/CPU time.
Мини-пример
const value = useMemo(() => ({ theme, setTheme }), [theme]);
<ThemeContext.Provider value={value}>{children}</ThemeContext.Provider>
Углубление (2-3 минуты)
- Свяжите тему "Какие проблемы у Context API по производительности?" с одним production-сценарием и объясните, почему она влияет на результат.
- Покажите, как изменение влияет на рендер и стоимость JavaScript.
- Зафиксируйте, какой компромисс вы принимаете и как защитите решение на интервью.
Типичные ошибки
- Не проверяют сценарий на медленных устройствах и сетях.
- Оптимизируют без baseline-метрик и не понимают реальный эффект.
- Путают соседние концепции и не обозначают границы применимости выбранного подхода.
Follow-up вопросы
- Как будете валидировать эффект на медленных устройствах?
- Как эта тема влияет на LCP/INP/CLS в реальном интерфейсе?
- Какой минимальный тест или проверка подтвердит, что решение действительно работает?
Что повторить
- Профилирование рендера до/после изменения.
- Границы
SSR/CSR/SSG/ISR(если применимо). - Пройдите 2-3 связных вопроса в Банке вопросов и проверьте устойчивость ответа.
Связанные модули и карта
8. Что такое Error Boundary и где его ограничения?
Теги: react, error-boundary, resilience, monitoring
Сложность: Middle
Короткий ответ
Error Boundary ловит ошибки рендера в дочернем дереве React-компонентов и показывает fallback UI.
Что сказать на интервью (30-60 секунд)
- Где это применяется: В производительности интерфейса: рендер, загрузка ассетов, отзывчивость и стабильность UX.
- Главный риск: Неправильная реализация дает лишние ререндеры, рост LCP/TTI и деградацию пользовательского пути.
- Как проверяете решение: Снимаю baseline в профайлере/DevTools, применяю изменение и подтверждаю эффект по LCP/INP/CPU time.
Мини-пример
<ErrorBoundary fallback={<ErrorScreen />}>
<App />
</ErrorBoundary>
Углубление (2-3 минуты)
- Свяжите тему "Что такое Error Boundary и где его ограничения?" с одним production-сценарием и объясните, почему она влияет на результат.
- Опишите влияние темы на user-centric метрики (
LCP,INP,CLS) и perceived performance. - Зафиксируйте, какой компромисс вы принимаете и как защитите решение на интервью.
Типичные ошибки
- Оптимизируют без baseline-метрик и не понимают реальный эффект.
- Не проверяют сценарий на медленных устройствах и сетях.
- Путают соседние концепции и не обозначают границы применимости выбранного подхода.
Follow-up вопросы
- Как будете валидировать эффект на медленных устройствах?
- Что выберете: простоту кода или оптимизацию, и по какому критерию?
- Какой минимальный тест или проверка подтвердит, что решение действительно работает?
Что повторить
- Критический путь рендера и метрики
LCP/INP/CLS. - Границы
SSR/CSR/SSG/ISR(если применимо). - Пройдите 2-3 связных вопроса в Банке вопросов и проверьте устойчивость ответа.
Связанные модули и карта
9. Когда использовать React.lazy и Suspense?
Теги: react, lazy, suspense, code-splitting
Сложность: Middle
Короткий ответ
Для code splitting и отложенной загрузки тяжелых частей интерфейса.
Что сказать на интервью (30-60 секунд)
- Где это применяется: В производительности интерфейса: рендер, загрузка ассетов, отзывчивость и стабильность UX.
- Главный риск: Неправильная реализация дает лишние ререндеры, рост LCP/TTI и деградацию пользовательского пути.
- Как проверяете решение: Сравниваю flamegraph и пользовательские метрики до/после, затем фиксирую guard-тест от регрессии.
Мини-пример
const Settings = React.lazy(() => import('./Settings'));
Углубление (2-3 минуты)
- Свяжите тему "Когда использовать
React.lazyиSuspense?" с одним production-сценарием и объясните, почему она влияет на результат. - Опишите влияние темы на user-centric метрики (
LCP,INP,CLS) и perceived performance. - Зафиксируйте, какой компромисс вы принимаете и как защитите решение на интервью.
Типичные ошибки
- Не проверяют сценарий на медленных устройствах и сетях.
- Переусложняют мемоизацию там, где нет измеримой проблемы.
- Путают соседние концепции и не обозначают границы применимости выбранного подхода.
Follow-up вопросы
- Как эта тема влияет на LCP/INP/CLS в реальном интерфейсе?
- Как будете валидировать эффект на медленных устройствах?
- Какой минимальный тест или проверка подтвердит, что решение действительно работает?
Что повторить
- Профилирование рендера до/после изменения.
- Критический путь рендера и метрики
LCP/INP/CLS. - Пройдите 2-3 связных вопроса в Банке вопросов и проверьте устойчивость ответа.
Связанные модули и карта
10. Какие основные причины лишних ререндеров в React?
Теги: react, rerender, profiler, optimization
Сложность: Middle
Короткий ответ
Нестабильные props (функции/объекты), слишком высокий state, изменения контекста и отсутствие мемоизации в нужных местах.
Что сказать на интервью (30-60 секунд)
- Где это применяется: В производительности интерфейса: рендер, загрузка ассетов, отзывчивость и стабильность UX.
- Главный риск: Неправильная реализация дает лишние ререндеры, рост LCP/TTI и деградацию пользовательского пути.
- Как проверяете решение: Снимаю baseline в профайлере/DevTools, применяю изменение и подтверждаю эффект по LCP/INP/CPU time.
Мини-пример
const onClick = () => setOpen(true); // новая ссылка каждый render
Углубление (2-3 минуты)
- Свяжите тему "Какие основные причины лишних ререндеров в React?" с одним production-сценарием и объясните, почему она влияет на результат.
- Опишите влияние темы на user-centric метрики (
LCP,INP,CLS) и perceived performance. - Зафиксируйте, какой компромисс вы принимаете и как защитите решение на интервью.
Типичные ошибки
- Не проверяют сценарий на медленных устройствах и сетях.
- Переусложняют мемоизацию там, где нет измеримой проблемы.
- Путают соседние концепции и не обозначают границы применимости выбранного подхода.
Follow-up вопросы
- Как будете валидировать эффект на медленных устройствах?
- Что выберете: простоту кода или оптимизацию, и по какому критерию?
- Какой минимальный тест или проверка подтвердит, что решение действительно работает?
Что повторить
- Критический путь рендера и метрики
LCP/INP/CLS. - Границы
SSR/CSR/SSG/ISR(если применимо). - Пройдите 2-3 связных вопроса в Банке вопросов и проверьте устойчивость ответа.
Связанные модули и карта
11. Разница между CSR, SSR и SSG?
Теги: frontend, csr-ssr-ssg, rendering-strategy, seo
Сложность: Middle
Короткий ответ
CSR рендерит в браузере, SSR рендерит HTML на сервере на каждый запрос, SSG генерирует HTML заранее на этапе сборки.
Что сказать на интервью (30-60 секунд)
- Где это применяется: В production-фичах React/JS: состояние, эффекты, интеграции и оптимизация UI.
- Главный риск: Растут сложность и техдолг, а скорость разработки падает из-за нестабильного поведения.
- Как проверяете решение: Снимаю baseline в профайлере/DevTools, применяю изменение и подтверждаю эффект по LCP/INP/CPU time.
Мини-пример
Next.js: static page + dynamic route with server rendering
Углубление (2-3 минуты)
- Свяжите тему "Разница между CSR, SSR и SSG?" с одним production-сценарием и объясните, почему она влияет на результат.
- Покажите, как изменение влияет на рендер и стоимость JavaScript.
- Зафиксируйте, какой компромисс вы принимаете и как защитите решение на интервью.
Типичные ошибки
- Оптимизируют без baseline-метрик и не понимают реальный эффект.
- Не проверяют сценарий на медленных устройствах и сетях.
- Путают соседние концепции и не обозначают границы применимости выбранного подхода.
Follow-up вопросы
- Как будете валидировать эффект на медленных устройствах?
- Что выберете: простоту кода или оптимизацию, и по какому критерию?
- Какой минимальный тест или проверка подтвердит, что решение действительно работает?
Что повторить
- Критический путь рендера и метрики
LCP/INP/CLS. - Границы
SSR/CSR/SSG/ISR(если применимо). - Пройдите 2-3 связных вопроса в Банке вопросов и проверьте устойчивость ответа.
Связанные модули и карта
12. Что такое hydration mismatch и как его избежать?
Теги: frontend, hydration, ssr, rendering
Сложность: Middle
Короткий ответ
Hydration mismatch — несоответствие между HTML с сервера и первым рендером клиента.
Что сказать на интервью (30-60 секунд)
- Где это применяется: В производительности интерфейса: рендер, загрузка ассетов, отзывчивость и стабильность UX.
- Главный риск: Неправильная реализация дает лишние ререндеры, рост LCP/TTI и деградацию пользовательского пути.
- Как проверяете решение: Сравниваю flamegraph и пользовательские метрики до/после, затем фиксирую guard-тест от регрессии.
Мини-пример
// Плохо: рендерим Date.now() напрямую в SSR markup
Углубление (2-3 минуты)
- Свяжите тему "Что такое hydration mismatch и как его избежать?" с одним production-сценарием и объясните, почему она влияет на результат.
- Опишите влияние темы на user-centric метрики (
LCP,INP,CLS) и perceived performance. - Зафиксируйте, какой компромисс вы принимаете и как защитите решение на интервью.
Типичные ошибки
- Не проверяют сценарий на медленных устройствах и сетях.
- Оптимизируют без baseline-метрик и не понимают реальный эффект.
- Путают соседние концепции и не обозначают границы применимости выбранного подхода.
Follow-up вопросы
- Что выберете: простоту кода или оптимизацию, и по какому критерию?
- Как эта тема влияет на LCP/INP/CLS в реальном интерфейсе?
- Какой минимальный тест или проверка подтвердит, что решение действительно работает?
Что повторить
- Границы
SSR/CSR/SSG/ISR(если применимо). - Профилирование рендера до/после изменения.
- Пройдите 2-3 связных вопроса в Банке вопросов и проверьте устойчивость ответа.
Связанные модули и карта
13. type vs interface в TypeScript?
Теги: typescript, type-vs-interface, api-contracts, styleguide
Сложность: Middle
Короткий ответ
Оба описывают форму данных, но interface проще расширять через declaration merging, а type гибче для union/intersection и утилитарных комбинаций.
Что сказать на интервью (30-60 секунд)
- Где это применяется: В типизации контрактов между UI, API и бизнес-логикой, чтобы ловить ошибки до рантайма.
- Главный риск: Слабые контракты увеличивают runtime-ошибки и ломают интеграции между слоями.
- Как проверяете решение: Собираю пример с DTO + runtime validation и сверяю, что invalid payload отклоняется предсказуемо.
Мини-пример
interface User { id: string }
type Status = 'idle' | 'loading' | 'done';
Углубление (2-3 минуты)
- Свяжите тему "
typevsinterfaceв TypeScript?" с одним production-сценарием и объясните, почему она влияет на результат. - Добавьте edge-case, где типы предотвращают регрессию.
- Зафиксируйте, какой компромисс вы принимаете и как защитите решение на интервью.
Типичные ошибки
- Не учитывают backward compatibility типов API.
- Используют
anyвместо явных контрактов на границах. - Путают соседние концепции и не обозначают границы применимости выбранного подхода.
Follow-up вопросы
- Какой контрпример сломает слабый типовой контракт?
- Где здесь compile-time проверка достаточна, а где нужна runtime?
- Какой минимальный тест или проверка подтвердит, что решение действительно работает?
Что повторить
- План миграции типов без breaking changes.
Union/narrowing/genericsв контексте задачи.- Пройдите 2-3 связных вопроса в Банке вопросов и проверьте устойчивость ответа.
Связанные модули и карта
14. Как использовать generics в TypeScript на практике?
Теги: typescript, generics, api-client, type-safety
Сложность: Middle
Короткий ответ
Generics позволяют писать переиспользуемые функции/типы с сохранением строгой типизации.
Что сказать на интервью (30-60 секунд)
- Где это применяется: В типизации контрактов между UI, API и бизнес-логикой, чтобы ловить ошибки до рантайма.
- Главный риск: Слабые контракты увеличивают runtime-ошибки и ломают интеграции между слоями.
- Как проверяете решение: Запускаю
tsc --noEmit, добавляю edge-case тесты и проверяю совместимость контрактов на границе API.
Мини-пример
function first<T>(arr: T[]): T | undefined {
return arr[0];
}
Углубление (2-3 минуты)
- Свяжите тему "Как использовать generics в TypeScript на практике?" с одним production-сценарием и объясните, почему она влияет на результат.
- Добавьте edge-case, где типы предотвращают регрессию.
- Зафиксируйте, какой компромисс вы принимаете и как защитите решение на интервью.
Типичные ошибки
- Не учитывают backward compatibility типов API.
- Используют
anyвместо явных контрактов на границах. - Путают соседние концепции и не обозначают границы применимости выбранного подхода.
Follow-up вопросы
- Какой контрпример сломает слабый типовой контракт?
- Как будете мигрировать типы без поломки потребителей API?
- Какой минимальный тест или проверка подтвердит, что решение действительно работает?
Что повторить
Union/narrowing/genericsв контексте задачи.- План миграции типов без breaking changes.
- Пройдите 2-3 связных вопроса в Банке вопросов и проверьте устойчивость ответа.
Связанные модули и карта
15. Что такое discriminated unions и зачем они нужны?
Теги: typescript, discriminated-union, state-modeling, reducers
Сложность: Middle
Короткий ответ
Это union объектов с общим дискриминатором (например, type), который позволяет TypeScript безопасно сужать тип.
Что сказать на интервью (30-60 секунд)
- Где это применяется: В типизации контрактов между UI, API и бизнес-логикой, чтобы ловить ошибки до рантайма.
- Главный риск: Слабые контракты увеличивают runtime-ошибки и ломают интеграции между слоями.
- Как проверяете решение: Собираю пример с DTO + runtime validation и сверяю, что invalid payload отклоняется предсказуемо.
Мини-пример
type State =
| { type: 'idle' }
| { type: 'loading' }
| { type: 'error'; message: string };
Углубление (2-3 минуты)
- Свяжите тему "Что такое discriminated unions и зачем они нужны?" с одним production-сценарием и объясните, почему она влияет на результат.
- Покажите границы типов между UI, API и доменной логикой.
- Зафиксируйте, какой компромисс вы принимаете и как защитите решение на интервью.
Типичные ошибки
- Не учитывают backward compatibility типов API.
- Надеются только на TypeScript без runtime-валидации входных данных.
- Путают соседние концепции и не обозначают границы применимости выбранного подхода.
Follow-up вопросы
- Какой контрпример сломает слабый типовой контракт?
- Как будете мигрировать типы без поломки потребителей API?
- Какой минимальный тест или проверка подтвердит, что решение действительно работает?
Что повторить
Union/narrowing/genericsв контексте задачи.- План миграции типов без breaking changes.
- Пройдите 2-3 связных вопроса в Банке вопросов и проверьте устойчивость ответа.
Связанные модули и карта
16. Какие utility types вы используете чаще всего?
Теги: typescript, utility-types, api, maintainability
Сложность: Middle
Короткий ответ
Чаще всего Partial, Pick, Omit, Record, Readonly, ReturnType.
Что сказать на интервью (30-60 секунд)
- Где это применяется: В типизации контрактов между UI, API и бизнес-логикой, чтобы ловить ошибки до рантайма.
- Главный риск: Слабые контракты увеличивают runtime-ошибки и ломают интеграции между слоями.
- Как проверяете решение: Собираю пример с DTO + runtime validation и сверяю, что invalid payload отклоняется предсказуемо.
Мини-пример
type UserPreview = Pick<User, 'id' | 'name'>;
type UserPatch = Partial<User>;
Углубление (2-3 минуты)
- Свяжите тему "Какие utility types вы используете чаще всего?" с одним production-сценарием и объясните, почему она влияет на результат.
- Покажите границы типов между UI, API и доменной логикой.
- Зафиксируйте, какой компромисс вы принимаете и как защитите решение на интервью.
Типичные ошибки
- Не учитывают backward compatibility типов API.
- Используют
anyвместо явных контрактов на границах. - Путают соседние концепции и не обозначают границы применимости выбранного подхода.
Follow-up вопросы
- Какой контрпример сломает слабый типовой контракт?
- Где здесь compile-time проверка достаточна, а где нужна runtime?
- Какой минимальный тест или проверка подтвердит, что решение действительно работает?
Что повторить
- План миграции типов без breaking changes.
- Контракты DTO/API и runtime-валидацию.
- Пройдите 2-3 связных вопроса в Банке вопросов и проверьте устойчивость ответа.
Связанные модули и карта
17. Promise.all vs Promise.allSettled?
Теги: javascript, promise-all, allsettled, resilience
Сложность: Middle
Короткий ответ
Promise.all падает на первой ошибке, Promise.allSettled дожидается завершения всех промисов и возвращает статус каждого.
Что сказать на интервью (30-60 секунд)
- Где это применяется: В production-фичах React/JS: состояние, эффекты, интеграции и оптимизация UI.
- Главный риск: Растут сложность и техдолг, а скорость разработки падает из-за нестабильного поведения.
- Как проверяете решение: Делаю воспроизводимый сценарий гонки/таймаута, добавляю логи порядка событий и проверяю стабильность в серии прогонов.
Мини-пример
const results = await Promise.allSettled([p1, p2, p3]);
Углубление (2-3 минуты)
- Свяжите тему "
Promise.allvsPromise.allSettled?" с одним production-сценарием и объясните, почему она влияет на результат. - Разберите порядок выполнения шагов при нормальном сценарии и при ошибке/таймауте.
- Зафиксируйте, какой компромисс вы принимаете и как защитите решение на интервью.
Типичные ошибки
- Игнорируют отмену, таймауты и повторные запросы, из-за чего появляются race conditions.
- Не учитывают поведение при ошибках внешних сервисов.
- Путают соседние концепции и не обозначают границы применимости выбранного подхода.
Follow-up вопросы
- Что изменится в поведении при таймауте внешнего сервиса?
- Как исключите race condition при параллельных запросах?
- Какой минимальный тест или проверка подтвердит, что решение действительно работает?
Что повторить
- Стратегии timeout, retry, cancellation и их ограничения.
- Порядок очередей/фаз выполнения и обработку ошибок.
- Пройдите 2-3 связных вопроса в Банке вопросов и проверьте устойчивость ответа.
Связанные модули и карта
18. Как работает AbortController и зачем он нужен?
Теги: javascript, abortcontroller, cancellation, requests
Сложность: Middle
Короткий ответ
AbortController позволяет отменять fetch и другие abortable операции, чтобы не держать лишние запросы и состояния.
Что сказать на интервью (30-60 секунд)
- Где это применяется: В production-фичах React/JS: состояние, эффекты, интеграции и оптимизация UI.
- Главный риск: Растут сложность и техдолг, а скорость разработки падает из-за нестабильного поведения.
- Как проверяете решение: Собираю короткий воспроизводимый пример, прогоняю edge-case и объясняю результат без подсказок.
Мини-пример
const c = new AbortController();
fetch('/api', { signal: c.signal });
c.abort();
Углубление (2-3 минуты)
- Свяжите тему "Как работает
AbortControllerи зачем он нужен?" с одним production-сценарием и объясните, почему она влияет на результат. - Разложите ответ на «механика -> применение -> ограничение», чтобы показать не только теорию, но и практику.
- Зафиксируйте, какой компромисс вы принимаете и как защитите решение на интервью.
Типичные ошибки
- Не проговаривают ограничения и edge-cases.
- Дают определение, но не объясняют, как это использовать в рабочем коде.
- Путают соседние концепции и не обозначают границы применимости выбранного подхода.
Follow-up вопросы
- Где граница применимости этого решения?
- Какой минимальный тест докажет корректность подхода?
- Какой минимальный тест или проверка подтвердит, что решение действительно работает?
Что повторить
- Базовые определения темы и 2 контрпримера (где работает и где ломается).
- Связанный вопрос из Банка вопросов для закрепления.
- Пройдите 2-3 связных вопроса в Банке вопросов и проверьте устойчивость ответа.
Связанные модули и карта
19. Что такое делегирование событий и когда оно полезно?
Теги: javascript, event-delegation, dom, performance
Сложность: Middle
Короткий ответ
Это обработка событий на общем родителе вместо подписки на каждый дочерний элемент.
Что сказать на интервью (30-60 секунд)
- Где это применяется: В производительности интерфейса: рендер, загрузка ассетов, отзывчивость и стабильность UX.
- Главный риск: Неправильная реализация дает лишние ререндеры, рост LCP/TTI и деградацию пользовательского пути.
- Как проверяете решение: Сравниваю flamegraph и пользовательские метрики до/после, затем фиксирую guard-тест от регрессии.
Мини-пример
list.addEventListener('click', e => {
const btn = e.target.closest('[data-id]');
if (!btn) return;
});
Углубление (2-3 минуты)
- Свяжите тему "Что такое делегирование событий и когда оно полезно?" с одним production-сценарием и объясните, почему она влияет на результат.
- Покажите, как изменение влияет на рендер и стоимость JavaScript.
- Зафиксируйте, какой компромисс вы принимаете и как защитите решение на интервью.
Типичные ошибки
- Не проверяют сценарий на медленных устройствах и сетях.
- Переусложняют мемоизацию там, где нет измеримой проблемы.
- Путают соседние концепции и не обозначают границы применимости выбранного подхода.
Follow-up вопросы
- Что выберете: простоту кода или оптимизацию, и по какому критерию?
- Как будете валидировать эффект на медленных устройствах?
- Какой минимальный тест или проверка подтвердит, что решение действительно работает?
Что повторить
- Границы
SSR/CSR/SSG/ISR(если применимо). - Профилирование рендера до/после изменения.
- Пройдите 2-3 связных вопроса в Банке вопросов и проверьте устойчивость ответа.
Связанные модули и карта
20. Что такое tree shaking и от чего он зависит?
Теги: frontend, tree-shaking, bundling, performance
Сложность: Middle
Короткий ответ
Tree shaking удаляет неиспользуемые экспорты из бандла, если код и сборка позволяют это статически определить.
Что сказать на интервью (30-60 секунд)
- Где это применяется: В производительности интерфейса: рендер, загрузка ассетов, отзывчивость и стабильность UX.
- Главный риск: Неправильная реализация дает лишние ререндеры, рост LCP/TTI и деградацию пользовательского пути.
- Как проверяете решение: Снимаю baseline в профайлере/DevTools, применяю изменение и подтверждаю эффект по LCP/INP/CPU time.
Мини-пример
import { usedFn } from './utils.js'; // не импортируем весь namespace без нужды
Куда дальше
- Вернитесь в модуль: React.
- Сверьтесь с картой темы: React.
- Продолжайте по маршруту: Middle трек.
- Закрепите один ответ на практике в Песочнице.
Углубление (2-3 минуты)
- Свяжите тему "Что такое tree shaking и от чего он зависит?" с одним production-сценарием и объясните, почему она влияет на результат.
- Опишите влияние темы на user-centric метрики (
LCP,INP,CLS) и perceived performance. - Зафиксируйте, какой компромисс вы принимаете и как защитите решение на интервью.
Типичные ошибки
- Переусложняют мемоизацию там, где нет измеримой проблемы.
- Не проверяют сценарий на медленных устройствах и сетях.
- Путают соседние концепции и не обозначают границы применимости выбранного подхода.
Follow-up вопросы
- Как эта тема влияет на LCP/INP/CLS в реальном интерфейсе?
- Что выберете: простоту кода или оптимизацию, и по какому критерию?
- Какой минимальный тест или проверка подтвердит, что решение действительно работает?
Что повторить
- Границы
SSR/CSR/SSG/ISR(если применимо). - Критический путь рендера и метрики
LCP/INP/CLS. - Пройдите 2-3 связных вопроса в Банке вопросов и проверьте устойчивость ответа.