TypeScript ошибка Type string is not assignable to type never как исправить
Рейтинг: 67.3% · 39 голосов
Войдите, чтобы голосовать
Голосовать «За» и «Против» могут только авторизованные пользователи. Войдите в свой аккаунт — или зарегистрируйтесь, это займёт минуту.
Нет аккаунта? Зарегистрироваться
TypeScript ошибка Type string is not assignable to type never как исправить
Застрял на непонятной ошибке TypeScript. Есть объект с ключами, делаю динамический доступ через переменную — и получаю 'Type string is not assignable to type never'. Код примерно такой: const key = someCondition ? 'foo' : 'bar'; obj[key] = value; Obj типизирован как Record с конкретными ключами. В чём вообще проблема и как правильно это фиксить?
✔ Лучший ответ выбран автором темы — 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: он не про эту ошибку, но ловит соседнюю — чтение по динамическому…
Re: TypeScript ошибка Type string is not assignable to type never как исправить
✔ Лучший ответ — выбран автором
Классика. Проблема в том, что TypeScript выводит тип key как string (широкий тип), а твой объект принимает только конкретные литеральные ключи. Когда TS пересекает string с допустимыми ключами объекта — получается never. Быстрое решение: явно типизировать key. Если у тебя есть тип объекта MyObj, делай так: const key: keyof MyObj = someCondition ? 'foo' : 'bar'. Тогда TS знает что key — один из допустимых ключей.
Re: TypeScript ошибка Type string is not assignable to type never как исправить
Добавлю к предыдущему ответу — ещё частая причина такой ошибки это когда у объекта разные типы значений для разных ключей, например { foo: string, bar: number }. Тогда obj[key] имеет тип string | number, а присваиваешь ты string — и для поля bar это невалидно. TypeScript именно поэтому и ругается. Тут нужно либо разделять логику по ключам через if/switch, либо использовать type assertion осторожно.
Re: TypeScript ошибка Type string is not assignable to type never как исправить
as keyof typeof obj спасает в 90% случаев в таких местах, но это не серебряная пуля — если ты промахнулся с ключом в рантайме, TS об этом не узнает. Правильнее сделать type guard или использовать Object.keys с проверкой. Но для быстрого фикса в простых случаях — нормально.
Re: TypeScript ошибка Type string is not assignable to type never как исправить
Ещё вариант который часто упускают: если key приходит снаружи (из пропсов, из API) — используй функцию с дженериком. Что-то вроде function getValue<T, K extends keyof T>(obj: T, key: K): T[K] { return obj[key]; }. Это и типобезопасно, и не требует никаких приведений типов. Выглядит многословно но TS потом сам выводит всё корректно.
Re: TypeScript ошибка Type string is not assignable to type never как исправить
Надо было сразу включить strict: true в tsconfig и noImplicitAny — тогда такие проблемы всплывают раньше, на этапе написания, а не когда уже намешал логики. Если проект старый и strict не включён — это техдолг который рано или поздно аукнется.
- raspberryguru
- Сообщения: 14
- Зарегистрирован: 11 май 2026, 05:05
Re: TypeScript ошибка Type string is not assignable to type never как исправить
✔ Лучший ответ — сформирован автоматически
Раз в треде уже есть getValue с дженериком — для записи нужен зеркальный хелпер: function setProp<T, K extends keyof T>(obj: T, key: K, value: T[K]) { obj[key] = value; }. Внутри дженерика TS не схлопывает типы в never, потому что K — конкретный ключ, а не union. И отдельно советую включить noUncheckedIndexedAccess в tsconfig: он не про эту ошибку, но ловит соседнюю — чтение по динамическому ключу, которого может не быть.
Re: TypeScript ошибка Type string is not assignable to type never как исправить
@jownby, вы описали ровно тот механизм, из-за которого ошибка звучит именно как «not assignable to never». Начиная с TS 3.5 запись по union-ключу требует, чтобы значение подходило под КАЖДЫЙ вариант, то есть под пересечение типов значений. Для { foo: string, bar: number } это string & number, а оно и есть never. Чтение даёт union, запись — intersection, в этой асимметрии вся соль.
Re: TypeScript ошибка Type string is not assignable to type never как исправить
@gdgdgd, тут не соглашусь: strict в этом кейсе не помог бы. Ошибка про never вылезает И при включённом strict — она вообще не из семейства implicit any, а следствие ужесточения проверки записей по индексам в самом компиляторе. То есть автор её и поймал именно потому, что проверки работают. Strict включать безусловно стоит, но продавать его как лекарство от этой конкретной болячки — мимо.
Поделиться темой:
✈ Telegram
VK
- Похожие темы
-
- TypeScript нативный компилятор на Go (tsc-go) — ждём 10x или рано радоваться?
10 ответов · 1080 просмотров
-
-
-
-
-
- Ошибка App Store rejection 4.3 guideline дублирование приложения как решить
8 ответов · 85 просмотров
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость