Вопросы на собеседовании: TypeScript-разработчик
100 реальных вопросов с образцовыми ответами и пояснениями для уровня Senior TypeScript-разработчик.
Смотреть пример резюме: TypeScript-разработчик →Тренировка флешкарточками
Интервальное повторение · Hunter Pass
Вопросы
Я свяжу выбранные ключи со строкой через K extends keyof T и верну Pick<T, K>.
- Сигнатура принимает readonly K[], поэтому литеральный кортеж вроде ['id', 'email'] сохраняет объединение 'id' | 'email'.
- Pick<T, K> меняет результат по выбранным полям, а не возвращает Partial<T>, который ошибочно сделал бы каждое поле необязательным.
- Runtime-реализация всё равно должна отклонять неизвестные имена колонок из JSON или пользовательского ввода, потому что keyof не выполняет runtime-валидацию.
Зачем это спрашивают: Интервьюер проверяет, умеет ли кандидат выразить конкретную связь входа и результата через минимальное ограничение дженерика.
Я опишу EventMap и свяжу ключ события с типом payload через индексированный доступ.
- Основная сигнатура emit<K extends keyof EventMap>(name: K, payload: EventMap[K]) сохраняет связь двух аргументов.
- Аналогичный callback в on<K extends keyof EventMap> должен принимать EventMap[K], чтобы издатели и подписчики использовали один контракт.
- Я буду генерировать или проверять EventMap по wire-схеме, потому что дженерик проверяет TypeScript-вызовы, но не сообщения из Kafka.
Зачем это спрашивают: Сильный ответ сохраняет связь именованного события с payload без взрыва числа перегрузок.
Я использую setField<T, K extends keyof T>(model: T, key: K, value: T[K]).
- K выводится из аргумента key, поэтому выбор 'age' задаёт для value объявленный тип возраста.
- Я не стану типизировать value как T[keyof T], потому что это объединение теряет связь и принимает значение любого другого поля.
- Для вложенных путей я предоставлю ограниченную по глубине утилиту или сгенерированную карту полей вместо неограниченного рекурсивного дженерика.
Зачем это спрашивают: Интервьюер оценивает, умеет ли кандидат сохранять связь нескольких позиций дженерика вместо их независимого расширения.
Я ограничу каждый этап минимальной вызываемой возможностью и передам его результат следующему этапу.
- Этап можно описать как Stage<Input, Output>, а builder принимает следующим только Stage<PreviousOutput, NextOutput>.
- Раздельные возможности parser, authorizer и serializer не заставляют плагин раскрывать методы, которые pipeline не вызывает.
- Я ограничу длину цепочки или сгенерирую перегрузки, если вывод variadic tuple создаст неприемлемую задержку редактора или диагностику.
Зачем это спрашивают: Интервьюер ожидает практичный дизайн дженериков, который проверяет композицию и не создаёт раздутый базовый контракт.
Я выведу C только из colors, а defaultColor типизирую как NoInfer<C>.
- Если colors выведен как 'red' | 'yellow' | 'green', то 'blue' проверяется против этого объединения, а не расширяет его.
- NoInfer управляет источником вывода, но сохраняет проверку присваиваемости аргумента по умолчанию.
- Я сделаю основной источник очевидным в API, потому что NoInfer не исправит модель с действительно неоднозначным владельцем C.
Зачем это спрашивают: Сильный ответ знает конкретную проблему направления вывода, которую решает NoInfer, и не представляет его универсальным оператором безопасности.
Он должен отклонить функцию только для Dog, потому что хост вправе вызвать её с другим Animal.
- При strictFunctionTypes параметры функций проверяются контравариантно, поэтому handler с более широким входом безопасен в более узкой позиции.
- Я объявлю callback как свойство со значением-функцией, а не метод, потому что проверка параметров методов сохраняет историческую бивариантность.
- Если плагин действительно обрабатывает только Dog, ключ регистрации или дженерик должен также сузить домен диспетчеризации хоста до Dog.
Зачем это спрашивают: Интервьюер проверяет, может ли кандидат объяснить вариантность через реальный поток данных и учесть исключение TypeScript для методов.
Я применю распределяемый условный тип к объединению ответов.
- T extends { status: 'ok' } ? T : never вычисляется для каждого члена объединения, когда T является голым параметром типа.
- Неуспешные варианты превращаются в never и исчезают, а разные успешные payload сохраняются.
- Я добавлю type-тесты со смешанными объединениями, never и any, потому что эти входы выявляют случайное расширение публичных утилит.
Зачем это спрашивают: Интервьюер оценивает точное применение распределяемого условного типа к реалистичному дискриминированному протоколу.
Я отключу распределение проверкой [T] extends [Serializable].
- Оборачивание в кортеж заставляет условие оценить объединение целиком, а не каждый член отдельно.
- Тогда один несериализуемый член отклонит весь batch-контракт вместо возврата частичного объединения.
- Я назову утилиту по семантике all-members, потому что синтаксис с кортежем легко случайно удалить при сопровождении.
Зачем это спрашивают: Сильный ответ отличает фильтрацию отдельных членов от ограничения всего объединения и осознанно управляет поведением.
Я выведу результат из вызываемой формы и нормализую его через Awaited.
- T extends (...args: any[]) => infer R ? Awaited<R> : never извлекает результат и обрабатывает вложенные PromiseLike-значения.
- Parameters<T> сохранит исходный кортеж аргументов, если обёртка передаёт вызов без изменений.
- Я не допущу any в публичном результате и отдельно протестирую перегруженные функции, потому что вывод из набора перегрузок использует последнюю сигнатуру.
Зачем это спрашивают: Интервьюер проверяет практическое применение infer и знание поведения перегруженных функций.
Я рекурсивно сопоставлю путь через template literal types и выведу каждый сегмент после двоеточия.
- Ветка `${string}:${infer Param}/${infer Rest}` добавляет Param и рекурсивно обрабатывает Rest, а финальная ветка берёт последний параметр.
- Route factory нужен const type parameter, чтобы путь остался литералом и не расширился до string.
- Я ограничу глубину рекурсии и верну Record<string, string> для динамических путей, которые не являются написанными литералами.
Зачем это спрашивают: Сильный ответ сочетает template inference, сохранение литералов и ограниченный fallback для реального routing API.
ReturnType выводит тип из последней сигнатуры перегрузки, поэтому я не стану восстанавливать через него соответствие всех перегрузок.
- Сигнатура реализации не является публично вызываемой перегрузкой, а последняя видимая сигнатура обычно представляет широкий общий случай.
- Для конечного соответствия я опубликую SearchResultMap и буду выбирать SearchResultMap[K] по ключу дженерика.
- Если разные формы вызова обязательны, я протестирую каждую перегрузку напрямую через tsd вместо вывода обещаний из ReturnType.
Зачем это спрашивают: Интервьюер проверяет известный крайний случай infer и умение заменить хрупкий анализ перегрузок явным контрактом.
Я буду отображать только явно редактируемый набор ключей и добавлю этим свойствам необязательность.
- EditableKeys<T> должен исключить id, createdAt и другие серверные ключи перед созданием { [K in EditableKeys<T>]?: T[K] }.
- Я не применю Partial<T> ко всей модели, потому что он молча рекламирует обновления, которые сервер отклоняет.
- При exactOptionalPropertyTypes отсутствие означает отсутствие изменения, а undefined запрещён, если wire-контракт явно его не допускает.
Зачем это спрашивают: Сильный ответ использует mapped types для реальной поверхности обновления, а не механически ослабляет всю сущность.
Я применю переназначение ключей с template literal по Extract<keyof State, string>.
- Mapped-ключ можно записать как `get${Capitalize<K>}`, а значением оставить функцию, возвращающую State[K].
- Ограничение K до string не создаёт имена для числовых или symbol-ключей, которые соглашение не умеет представить.
- Я сгенерирую runtime-функции getters из того же списка ключей, потому что mapped type сам не создаёт JavaScript-свойства.
Зачем это спрашивают: Интервьюер оценивает переназначение ключей, контроль их домена и границу между сгенерированными типами и runtime-объектами.
Я выведу имена callback из конечных ключей EventMap и переназначу каждый ключ один раз.
- Mapped type может превратить checkoutStarted в onCheckoutStarted и сохранить соответствующий payload EventMap[K].
- Я не стану объединять независимые unions для product, action, region и version, потому что template literals умножают все комбинации.
- Когда каталог достигнет сотен сгенерированных имён, кодогенерация даст более быструю проверку и понятный declaration output.
Зачем это спрашивают: Сильный ответ применяет template literals к ограниченному каталогу и понимает, когда комбинаторный рост перевешивает пользу.
Я выведу dot paths рекурсивным mapped type, но введу небольшой предел глубины.
- Счётчик на кортеже остановит раскрытие после четырёх или пяти уровней, что соответствует соглашению каталога и ограничивает число инстанцирований.
- Массивы и функции должны быть конечными значениями, чтобы утилита не перечисляла их методы как ключи переводов.
- Для каталога на 20 000 ключей я сгенерирую union из исходных файлов вместо повторного вычисления в каждой программе потребителя.
Зачем это спрашивают: Интервьюер проверяет, ограничено ли рекурсивное программирование типов реальной формой данных и стоимостью компилятора.
Я выберу кодогенерацию, когда раскрытие схемы становится большим, рекурсивным или общим для нескольких языков.
- Условные типы полезны для небольших написанных связей, но не валидируют runtime-документ и заставляют каждый редактор повторять дорогую работу.
- Зафиксированный генератор один раз создаст именованные типы запросов и ответов, а CI проверит детерминированный output по источнику OpenAPI.
- Я оставлю тонкий рукописный адаптер вокруг сгенерированного transport-кода, чтобы изменения генератора не проникали в прикладные модули.
Зачем это спрашивают: Сильный ответ задаёт конкретную границу между полезными type-level вычислениями и генерацией схем во время сборки.
Я буду монотонно мигрировать границы пакетов относительно одной strict-базы.
- Я сгруппирую ошибки, начну с листьев графа зависимостей и включу strict в пакете только после очистки его публичных деклараций.
- Project references позволят строгим пакетам отдавать проверенные декларации, пока legacy-пакеты остаются за явными пограничными адаптерами.
- CI запретит новые suppressions и отключение strict в готовых пакетах, а временные исключения будут отслеживаться до удаления.
Зачем это спрашивают: Интервьюер оценивает миграцию, которая сохраняет поставку и последовательно увеличивает проверяемые гарантии компилятора.
Я смоделирую optional-поля как потенциально отсутствующие без автоматического разрешения undefined.
- При name?: string | null вызывающий код может пропустить name, передать строку или null, но name: undefined будет отклонён.
- Это соответствует JSON, потому что undefined не является JSON-значением и не должен создавать скрытое четвёртое состояние patch.
- Serializer и runtime-схема должны применять те же правила отсутствия и null до отправки patch на сервер.
Зачем это спрашивают: Сильный ответ связывает семантику exact optional properties с конкретным wire-протоколом и разными состояниями обновления.
Я явно покажу отсутствие на границе динамического поиска вместо утверждения, что каждое значение существует.
- API getTranslation(key): string | undefined честен для произвольных строк и позволяет вызывающему коду выбрать fallback.
- Для сгенерированных конечных ключей mapped Record<TranslationKey, string> докажет полноту покрытия и вернёт string.
- Я оставлю non-null assertions только для локально проверенного инварианта, а не разбросаю их по тысячам чтений.
Зачем это спрашивают: Интервьюер проверяет, приводит ли строгий индексный доступ к честным контрактам контейнера, а не к массовым assertions.
Я сужу пойманное значение до чтения полей конкретной библиотеки.
- axios.isAxiosError(error) даёт runtime-доказательство для AxiosError, а error instanceof Error обрабатывает обычные исключения.
- Для неизвестных значений вроде строк нужен безопасный fallback, потому что JavaScript позволяет выбросить любое значение.
- Я нормализую все ветки в один union прикладных ошибок, чтобы остальной код не зависел от внутренностей Axios.
Зачем это спрашивают: Сильный ответ применяет runtime-сужение на границе зависимости и превращает неизвестные сбои в стабильный внутренний контракт.
Закрытые вопросы
- 21
Guard доказал наличие config.token, но TypeScript отклоняет его использование в отложенном callback, потому что config изменяем; как сохранить сужение?
typescriptcallbackstype-narrowing - 22
Checkout workflow содержит 14 состояний, а новые добавляются каждый квартал; как заставить каждый reducer обрабатывать их исчерпывающе?
- 23
PaymentRouter обрабатывает 18 вариантов способов оплаты, включая BankTransfer, CardPayment и StoredMethod с optional iban и pan; почему проверка 'iban' оставляет StoredMethod в обеих ветках?
types - 24
Type predicate isUser(value): value is User сейчас возвращает true после проверки только id; что вы потребуете, прежде чем доверять ему во всём authentication SDK?
authtype-narrowing - 25
Command registry должен содержать каждый CommandName и сохранять точный тип параметров каждого handler; почему выбрать satisfies вместо аннотации или assertion?
registries - 26
defineRoutes принимает 70 литеральных routes и сейчас требует as const от вызывающего кода; как const type parameter улучшит API?
generics - 27
API fetchResource поддерживает user, invoice и report с разными результатами; выбрать перегрузки или generic resource map?
genericsapisource-maps - 28
Публичный npm SDK случайно генерирует анонимный return type на 200 строк с внутренними классами; как переработать поверхность деклараций?
npm - 29
SDK принимает CreateUserInput, но переменная с лишними admin-полями проходит структурное присваивание, хотя inline-литерал отклоняется; как обеспечить точность?
- 30
Экосистема плагинов позволяет сторонним пакетам добавлять поля в FastifyInstance; когда уместен module augmentation и что может сломаться?
- 31
npm-библиотека поставляет ESM и CommonJS, а NodeNext-потребители получают ошибки default import; как согласовать runtime и декларации?
npmmodules - 32
Path alias в монорепозитории позволяет приложениям импортировать @platform/auth/src/private, хотя опубликованный пакет скрывает этот путь; как обеспечить реальную границу?
monorepo - 33
Восемь сервисов и два мобильных клиента используют общий OpenAPI-контракт; что должно быть источником истины: TypeScript interfaces, Zod schemas или OpenAPI?
typescripttypesschema - 34
Patch-релиз ужесточает T extends object до T extends Record<string, unknown>, и сборки потребителей падают; является ли это breaking change на уровне типов?
versioning - 35
Как тестировать публичную библиотеку Result<T, E> на TypeScript 5.4-5.8, не полагаясь только на runtime-тесты?
typescript - 36
Монорепозиторий из 120 пакетов проверяется 11 минут, потому что один tsconfig загружает все исходники; как project references изменят архитектуру?
monorepotsconfig - 37
Что в таком монорепозитории с references должно находиться в root solution tsconfig, а что в общем base tsconfig?
monorepotsconfig - 38
Прогретые CI-сборки переиспользуют .tsbuildinfo, но после переноса jobs между runners появляются устаревшие результаты; как задать cache key и проверить кэш?
validationcaching - 39
После добавления type utility отклик редактора вырос с 300 мс до 8 секунд; какие измерения TypeScript compiler вы соберёте сначала?
feedbacktypescript - 40
Permission type объединяет 20 ресурсов, 12 действий, 6 регионов и 4 scope через template literals; почему это нагружает checker и что изменить?
- 41
Утилита DeepReadonly достигает excessive type instantiation на сгенерированных схемах глубиной 30 уровней; как ограничить её?
schema - 42
Declaration emit теперь занимает половину шестиминутной сборки библиотеки и создаёт огромные структурные типы; какие изменения вы проверите?
- 43
Включение skipLibCheck сокращает CI на 90 секунд в репозитории из 120 пакетов; от чего именно вы отказываетесь?
- 44
Пакет Cloudflare Worker случайно видит document и window, потому что base-конфиг монорепозитория включает DOM; как настроить module, moduleResolution и lib?
monorepoconfigdom - 45
Два workspace устанавливают разные копии общего пакета типов, и бренд на unique symbol становится несовместимым; как предотвратить такую архитектуру?
architecture - 46
Billing service регулярно смешивает UserId и InvoiceId, потому что оба являются строками; как ввести бренды без небезопасных casts?
- 47
Ad platform передаёт миллисекунды в API, ожидающий центы, потому что оба значения являются numbers; уместны ли брендированные числовые единицы?
api - 48
Transaction builder не должен открывать commit до begin и validate; как typestate может закодировать эту последовательность?
transactionsvalidation - 49
Публичный DeepMerge type библиотеки содержит 11 conditional branches и замедляет 300 проектов-потребителей; как задать бюджет сложности типов?
algorithms - 50
Сгенерированному GraphQL client всё ещё нужны пять casts вокруг стороннего cache API; как локализовать эти escape hatches?
graphqlcachingdependencies - 51
После рефакторинга в монорепозитории на 900 000 строк появляется 200-строчная ошибка присваиваемости внутри составного типа router; как до сегодняшнего релиза найти первое полезное несоответствие?
refactoringmonorepo - 52
Generic-обёртка cache превращает результат SDK-вызова из User в Promise<unknown> в 140 местах; как локализовать поломку вывода типов?
promisesgenericsadvanced-types - 53
После добавления withRetry к 30 методам repository литеральные варианты результата расширяются до unknown только для async callback; что вы проверите и измените?
asynccallbacks - 54
Logging decorator, применённый к перегруженной функции search, превращает Parameters<typeof search> в never для одной формы вызова; релиз через два часа. Что вы сделаете?
decoratorsloggingforms - 55
После обновления lockfile CI внезапно сообщает о 430 duplicate identifier между двумя пакетами @types, хотя файлы приложения не менялись; что вы сделаете сначала?
packaging - 56
Два workspace-пакета экспортируют одинаково выглядящие брендированные типы Session, но присваивание ломается после разрешения auth-types 4.2 в одном и 4.3 в другом; как доказать и исправить version skew?
sessions - 57
Обновление TypeScript в монорепозитории из 80 пакетов создаёт 1 700 diagnostics, но security требует обновиться за пять дней; как отделить реальные дефекты от изменений деклараций?
churnmonorepotypescript - 58
В production возникает 500, потому что response as User скрыл отсутствие массива permissions в partner API; как локализовать инцидент и предотвратить такой же cast?
incidentsapi - 59
Event consumer использовал payload as unknown as InvoicePaid, принял 3 200 некорректных сообщений и повредил projection; каков ваш план восстановления?
recovery - 60
В payments-пакете на 90 000 строк есть 1 400 явных any, а команда может выделять только 10 процентов каждого sprint; как сжигать долг без игры со счётчиком?
agile - 61
Сгенерированный analytics SDK экспортирует any в 600 payload событий, и product code уже зависит от полей с опечатками; как усилить типы при ежедневных релизах команд?
- 62
В день релиза в одном legacy-пакете появляются 260 strictNullChecks errors, и менеджер просит установить strict false в root; как сохранить узкую границу?
- 63
Нужно за девять месяцев перенести JavaScript-приложение на 420 000 строк с 38 еженедельными релизами на TypeScript; что изменить сначала без остановки поставки?
typescriptjavascript - 64
Через шесть месяцев после начала JS-to-TS migration 11 000 файлов компилируются только при выключенном checkJs, а ts-nocheck вырос на 35 процентов; как возобновить прогресс?
migrations - 65
Codemod преобразовал 4 800 файлов из CommonJS в TypeScript, но 73 модуля теперь выполняют initialization в другом порядке; как поступить с batch?
typescriptmodulessoft-skills - 66
У критичной JavaScript-библиотеки fraud detection нет declarations, она возвращает пять недокументированных форм результата и должна работать ещё квартал; как безопасно её интегрировать?
javascript - 67
После добавления рекурсивной утилиты Path<T> чистая проверка типов растёт с 48 секунд до 6 минут 20 секунд в 22 пакетах; как диагностировать и безопасно откатить регрессию?
recursion - 68
VS Code completion замедляется с 250 мс до 7 секунд после роста permission template-literal type до 18 000 членов; что изменить сначала?
types - 69
Сборка библиотеки растёт с 2 до 9 минут после появления у экспортируемой factory огромного inferred return type; как проверить, что причина в declaration emit?
advanced-types - 70
tsc начинает превышать лимит CI в 8 GB в workspace из 80 пакетов после того, как три пакета начали импортировать исходники друг друга; как восстановить сборку?
compiler - 71
Warm CI проходит, но чистый nightly tsc -b падает в 14 пакетах после переноса cached .tsbuildinfo между runners; что вы проверите?
cachingcompiler - 72
Восемь разработчиков не видят ошибку в VS Code, но CI сообщает TS2345 в том же файле после релиза общего config; как сегодня добиться parity?
config - 73
Package компилируется внутри монорепозитория, но NodeNext consumer через несколько минут после установки получает TS1479 и default-import error; как отлаживать опубликованный artifact?
monorepoartifacts - 74
Declaration emit падает с TS4023, потому что inferred result экспортируемой функции называет private type зависимости; 25 consumers нужен patch сегодня. Что изменить?
dependenciesadvanced-types - 75
Включение skipLibCheck убирает 620 CI errors, но один service всё ещё падает, потому что две libraries расходятся по Request.user; оставите ли вы flag?
conflict - 76
Non-null assertion на session.user! вызывает около 20 периодических checkout failures в день после асинхронного logout; как это исправить?
asyncfundamentalssessions - 77
Чтение prices[index] за границами массива создало NaN в 600 invoices, а noUncheckedIndexedAccess выключен в приложении на 300 000 строк; каков первый безопасный шаг?
indexes - 78
TypeScript отклоняет config.token внутри queue callback, хотя if-check прошёл 40 строк назад; коллега предлагает config.token!. Что вы проверите на review?
typescriptcallbacksdata-structures - 79
Custom predicate isAccount проверяет только id, и 90 malformed records проходят его до сбоя на account.plan; как восстановить доверие к predicate?
- 80
Добавили пятнадцатое payment state, но default branch reducer молча возвращала старое состояние, и 4 процента refunds зависли; как предотвратить повторение?
- 81
PATCH client отправляет nickname: undefined, но serializer удаляет поле, пока один server трактует его наличие как удаление; под риском 12 000 profiles. Что изменить?
serializationfundamentals - 82
Типы FastifyInstance включают auditLog через module augmentation, но один из 12 services забыл зарегистрировать plugin и падает на первом request; как закрыть разрыв?
- 83
Patch release меняет порядок двух перегрузок, и 35 consumer builds выводят string вместо UserId; как поступить с релизом?
soft-skillsadvanced-types - 84
OpenAPI client продолжает компилироваться после изменения provider поля total с number на numeric string, и 8 процентов reports показывают склеенные totals; где вы вмешаетесь?
openapi - 85
Команда поддерживает Zod schema и отдельный interface User; через три релиза schema принимает null там, где interface обещает string, что вызывает 240 failures. Как убрать drift?
typesfundamentalsschema - 86
Public Result library проходит runtime tests, но TypeScript 5.8 меняет narrowing в 18 consumer call sites; обещана поддержка версий 5.5-5.8. Что тестировать и выпускать?
promisestypescripttype-narrowing - 87
На code review generic-хелпер parse<T> из 20 строк возвращает JSON.parse(text) as T и уже используется в 47 файлах; какое точное изменение вы потребуете до approval?
genericscode-review - 88
Pull request добавляет conditional type из 14 веток для одной формы и раздувает errors до 120 строк; автор говорит, что это убирает 30 дублированных строк. Как провести review?
code-reviewformsadvanced-types - 89
Junior исправляет 16 compiler errors в payment PR через as unknown as и просит approval до дневного deploy; как менторить, не забирая задачу?
mentoringdeployment - 90
Коллега отключает useUnknownInCatchVariables для пакета из 60 файлов, потому что Axios upgrade создаёт 85 errors; какой feedback и rollout вы предложите?
feedback - 91
На review тип configuration с 12 ключами заменяют на Record<string, any>, чтобы до завтрашнего launch добавить два plugin fields; что вы предложите?
config - 92
Cloudflare Worker компилируется, потому что общий tsconfig включает DOM, но падает на document в 15 процентах requests после запуска новой ветки; как исправить configuration?
configtsconfigdom - 93
Приложение импортирует @platform/auth/src/private через tsconfig path, проходит local type-check, но production bundle не разрешает путь в 6 из 20 deployments; что изменить?
deploymenttsconfig - 94
После переключения moduleResolution на Bundler в Node service type-check проходит, но production отклоняет три extensionless imports; как восстановиться?
bundling - 95
Введение project references создаёт cycle между ui, analytics и config, и tsc -b останавливает 120 пакетов; release train уходит сегодня. Что делать?
configcompilermonorepo - 96
Source-generated file меняется на каждой машине из-за путей в declarations, создавая diff на 9 000 строк и cache misses; как стабилизировать результат?
caching - 97
Tests создают mock нового обязательного поля Invoice.currency через as Invoice, поэтому production formatting падает, хотя 1 200 tests проходят; как исправить test boundary?
mocking - 98
Library встраивает const enum в 40 consumers, затем server deploy меняет значения members, и старые clients отправляют неверный numeric code; как локализовать skew?
deploymentenums - 99
Включение isolatedModules ломает 310 global-script файлов с cross-file namespace merging, но rollout нового transpiler назначен на эту неделю; как безопасно мигрировать?
kubernetesmodules - 100
Pull request ужесточает T extends object до T extends Record<string, unknown> в широко используемом package, и preview build ломает 260 downstream calls; автор считает это patch. Что вы решите?
code-review