Я читал несколько похожих тем, но все они посвящены некоторым конкретным случаям, и я получаю эту ошибку в самом простом случае. В чем вообще смысл этой ошибки и как ее решить?
type SomeInterface = {
prop1: number
prop2: boolean
}
const testFn = (obj: SomeInterface, key: keyof SomeInterface, value: any) => {
obj[key] = value
}
Я думаю, проблема может заключаться в том, что 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;
}
Никаких проблем с дженериками, это выглядит более безопасно для типов, чем никогда, большое спасибо