TypeScript ошибка Type string is not assignable to type never как исправить

Рейтинг: 67.3% · 39 голосов
Frontend и backend разработка: JavaScript, TypeScript, React, Next.js, Vue, Node.js, PHP, REST и GraphQL API, вёрстка HTML/CSS и современные веб-приложения.
Ответить
Аватара пользователя
jbosco
Сообщения: 60
Зарегистрирован: 11 май 2026, 02:28

TypeScript ошибка Type string is not assignable to type never как исправить

Сообщение jbosco »

Застрял на непонятной ошибке TypeScript. Есть объект с ключами, делаю динамический доступ через переменную — и получаю 'Type string is not assignable to type never'. Код примерно такой: const key = someCondition ? 'foo' : 'bar'; obj[key] = value; Obj типизирован как Record с конкретными ключами. В чём вообще проблема и как правильно это фиксить?
👍1 ❤️1 🔥3 😄1 🤔
✔ Лучший ответ выбран автором темы — pythonfan
Классика. Проблема в том, что TypeScript выводит тип key как string (широкий тип), а твой объект принимает только конкретные литеральные ключи. Когда TS пересекает string с допустимыми ключами объекта — получается never. Быстрое решение: явно типизировать key. Если у тебя есть тип объекта MyObj, делай так: const key: keyof MyObj = someCondition ? 'foo' : 'bar'. Тогда TS знает что key — один из…
Перейти к ответу →
✔ Лучший ответ сформирован автоматически — mynancy
Раз в треде уже есть getValue с дженериком — для записи нужен зеркальный хелпер: function setProp(obj: T, key: K, value: T[K]) { obj[key] = value; }. Внутри дженерика TS не схлопывает типы в never, потому что K — конкретный ключ, а не union. И отдельно советую включить noUncheckedIndexedAccess в tsconfig: он не про эту ошибку, но ловит соседнюю — чтение по динамическому…
Перейти к ответу →
Аватара пользователя
pythonfan
Сообщения: 15
Зарегистрирован: 11 май 2026, 22:42

Re: TypeScript ошибка Type string is not assignable to type never как исправить

Сообщение pythonfan »

✔ Лучший ответ — выбран автором
Классика. Проблема в том, что TypeScript выводит тип key как string (широкий тип), а твой объект принимает только конкретные литеральные ключи. Когда TS пересекает string с допустимыми ключами объекта — получается never. Быстрое решение: явно типизировать key. Если у тебя есть тип объекта MyObj, делай так: const key: keyof MyObj = someCondition ? 'foo' : 'bar'. Тогда TS знает что key — один из допустимых ключей.
👍 ❤️1 🔥2 😄 🤔
Аватара пользователя
jownby
Сообщения: 23
Зарегистрирован: 21 май 2026, 03:42

Re: TypeScript ошибка Type string is not assignable to type never как исправить

Сообщение jownby »

Добавлю к предыдущему ответу — ещё частая причина такой ошибки это когда у объекта разные типы значений для разных ключей, например { foo: string, bar: number }. Тогда obj[key] имеет тип string | number, а присваиваешь ты string — и для поля bar это невалидно. TypeScript именно поэтому и ругается. Тут нужно либо разделять логику по ключам через if/switch, либо использовать type assertion осторожно.
👍1 ❤️1 🔥2 😄2 🤔
Аватара пользователя
async2025
Сообщения: 44
Зарегистрирован: 13 май 2026, 02:57

Re: TypeScript ошибка Type string is not assignable to type never как исправить

Сообщение async2025 »

as keyof typeof obj спасает в 90% случаев в таких местах, но это не серебряная пуля — если ты промахнулся с ключом в рантайме, TS об этом не узнает. Правильнее сделать type guard или использовать Object.keys с проверкой. Но для быстрого фикса в простых случаях — нормально.
👍1 ❤️ 🔥 😄 🤔
Аватара пользователя
qcdeed
Сообщения: 57
Зарегистрирован: 11 май 2026, 20:16

Re: TypeScript ошибка Type string is not assignable to type never как исправить

Сообщение qcdeed »

Ещё вариант который часто упускают: если key приходит снаружи (из пропсов, из API) — используй функцию с дженериком. Что-то вроде function getValue<T, K extends keyof T>(obj: T, key: K): T[K] { return obj[key]; }. Это и типобезопасно, и не требует никаких приведений типов. Выглядит многословно но TS потом сам выводит всё корректно.
👍3 ❤️ 🔥 😄1 🤔
Аватара пользователя
gdgdgd
Сообщения: 77
Зарегистрирован: 11 май 2026, 03:27

Re: TypeScript ошибка Type string is not assignable to type never как исправить

Сообщение gdgdgd »

Надо было сразу включить strict: true в tsconfig и noImplicitAny — тогда такие проблемы всплывают раньше, на этапе написания, а не когда уже намешал логики. Если проект старый и strict не включён — это техдолг который рано или поздно аукнется.
👍5 ❤️1 🔥2 😄 🤔2
Аватара пользователя
raspberryguru
Сообщения: 14
Зарегистрирован: 11 май 2026, 05:05

Re: TypeScript ошибка Type string is not assignable to type never как исправить

Сообщение raspberryguru »

Спасибо всем! Решил через keyof typeof obj, стало чисто. Заодно разобрался почему так работает — теперь понятно.
👍1 ❤️ 🔥2 😄 🤔
Аватара пользователя
mynancy
Сообщения: 24
Зарегистрирован: 19 май 2026, 07:17

Re: TypeScript ошибка Type string is not assignable to type never как исправить

Сообщение mynancy »

✔ Лучший ответ — сформирован автоматически
Раз в треде уже есть getValue с дженериком — для записи нужен зеркальный хелпер: function setProp<T, K extends keyof T>(obj: T, key: K, value: T[K]) { obj[key] = value; }. Внутри дженерика TS не схлопывает типы в never, потому что K — конкретный ключ, а не union. И отдельно советую включить noUncheckedIndexedAccess в tsconfig: он не про эту ошибку, но ловит соседнюю — чтение по динамическому ключу, которого может не быть.
👍 ❤️ 🔥1 😄 🤔2
Аватара пользователя
rojo7509
Сообщения: 38
Зарегистрирован: 12 май 2026, 13:19

Re: TypeScript ошибка Type string is not assignable to type never как исправить

Сообщение rojo7509 »

@jownby, вы описали ровно тот механизм, из-за которого ошибка звучит именно как «not assignable to never». Начиная с TS 3.5 запись по union-ключу требует, чтобы значение подходило под КАЖДЫЙ вариант, то есть под пересечение типов значений. Для { foo: string, bar: number } это string & number, а оно и есть never. Чтение даёт union, запись — intersection, в этой асимметрии вся соль.
👍1 ❤️ 🔥3 😄1 🤔
Аватара пользователя
davkar
Сообщения: 58
Зарегистрирован: 11 май 2026, 03:00

Re: TypeScript ошибка Type string is not assignable to type never как исправить

Сообщение davkar »

@gdgdgd, тут не соглашусь: strict в этом кейсе не помог бы. Ошибка про never вылезает И при включённом strict — она вообще не из семейства implicit any, а следствие ужесточения проверки записей по индексам в самом компиляторе. То есть автор её и поймал именно потому, что проверки работают. Strict включать безусловно стоит, но продавать его как лекарство от этой конкретной болячки — мимо.
👍2 ❤️1 🔥 😄 🤔1
Ответить
Поделиться темой: ✈ Telegram VK

Вернуться в «Веб-разработка»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость