Я вообще не понимаю, как задействован SuperType
, поскольку H
не может быть назначен на SuperType
. Я пока проигнорирую SuperType
, и вы можете сказать мне, нужно ли изменить ваш вопрос, чтобы использовать его.
Моя склонность к вводу updateProp()
будет следующей:
function updateProp<K extends PropertyKey>(prop: K) {
return function <T extends Record<K, any>>(value: T) {
return value;
}
}
Здесь я говорю, что K
может быть любой клавиатурой, и тогда возвращаемая функция примет любое значение с K
в качестве ключа и вернуть тот же тип вещи. Это дает желаемый эффект при использовании с instance.update()
:
instance.update(updateProp('name')); // okay
instance.update(updateProp('id')); // okay
instance.update(updateProp('notExists')); // error, as desired
Это работает для вас? Надеюсь, это поможет; удачи!
Детская площадка ссылка на код
ОБНОВЛЕНИЕ
Для вашего модифицированного примера я изменил типизацию, но сохранил ту же основную c идею: вам нужно updateProp()
быть generi c в типе его аргумента, а затем вычислите из него другие типы:
function updateProp<E>(prop: E) {
return function <T extends SuperType<E>>(value: T) {
return value;
}
}
instance.update(updateProp({ prop: 123 })); // okay
instance.update(updateProp({ prop: "" })); // error
instance.update(updateProp({ prop: 123, unexpectedProp: 456 })); // error
Надеюсь, что это снова поможет; удачи.
Детская площадка ссылка на код