Ts2322 "не может быть назначен тип никогда" ошибка в самом простом случае

Я читал несколько похожих тем, но все они посвящены некоторым конкретным случаям, и я получаю эту ошибку в самом простом случае. В чем вообще смысл этой ошибки и как ее решить?

type SomeInterface = {
  prop1: number
  prop2: boolean
}

const testFn = (obj: SomeInterface, key: keyof SomeInterface, value: any) => {
  obj[key] = value
}
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
1
0
95
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я думаю, проблема может заключаться в том, что obj[key] — это либо number, либо boolean, и, поскольку между этими двумя типами нет пересечения, он фактически становится never.

Это один из способов исправить это с помощью универсального:

const testFn  = function<T extends keyof SomeInterface>(obj: SomeInterface, key: T, value: SomeInterface[T]) {
  obj[key] = value
}

По сути, мы говорим, что T — это ключ SometInterface, который нужно передать в качестве второго аргумента.

Но мы также говорим, что третий аргумент (значение) должен соответствовать типу ключа SomeInterface.

Ответ принят как подходящий

Проблема

Еще одна вещь, о которой следует помнить, это то, что obj[key] с key is keyof SometInterface всегда будет возвращать never тип, которому не присвоен даже any тип.

Решение

Возможно, вы знаете, что это довольно распространенный вариант использования, который можно разрешить с помощью универсального типа:

const testFn = <T extends SomeInterface, K extends keyof T>(obj: T, key: K, value: T[K]) => {
  obj[key] = value
}

Но если вы не хотите использовать общий тип, вы можете установить тип value как never:

const testFn = (obj: SomeInterface, key: keyof SomeInterface, value: never) => {
  obj[key] = value;
}

Никаких проблем с дженериками, это выглядит более безопасно для типов, чем никогда, большое спасибо

Dmitry Reutov 26.12.2020 10:01

Другие вопросы по теме