Включите режим компиляции --strict
, чтобы value
выдавало предупреждение "неявное any
".Тип value
должен быть T[U]
, тип поиска .
Обратите внимание, что если вы хотите, чтобы универсальная функция карри работала правильно, вам необходимо поместить параметры типа в нужное место:
const setItem = <T>(obj: T) => <U extends keyof T>(key: U, value: T[U]): void => {
obj[key] = value;
}
Вы хотите, чтобы setItem(obj)
возвращала универсальную функциюкоторый может принять любой U extends keyof T
для key
, поэтому параметр U
должен быть в этой возвращаемой функции.Если вы поместите <T, U>
в первую функцию, то компилятор попытается вывести U
из значений, переданных в setIem()
, и не сможет.Это в конечном итоге расширится U
вплоть до keyof T
, и это не сможет предотвратить ошибки.
Давайте удостоверимся, что версия здесь работает:
const person = {
name: 'James',
age: 13,
}
const setPerson = setItem(person)
setPerson('name', 10); // error
setPerson('name', 'Jill'); // okay
setPerson('age', 10); // okay
setPerson('age', 'Jill'); // error
Детская площадка ссылка на код
Надеюсь, что поможет;удачи!