У меня есть несколько функций, и я хочу частично применить первый аргумент ко всем из них. Упрощенный пример:
import _ from 'lodash'
const funcs = {
add: (a: number, b: number) => {
return a + b
},
multiply: (a: number, ...rest: number[]) => {
let total = a
for (const num of rest) {
total = total * num
}
return total
},
}
const result = _.mapValues(funcs, func => _.partial(func, 1))
Это отчасти делает то, что я хочу: typecript знает, что result.add - это функция, которая, например, принимает одно число.
Однако, он думает, что result.multiply - это функция, которая принимает одно число, а не переменное число (я полагаю, из-за ограничений в поддержке машинописи loda sh). Даже без этого ограничения я хочу сделать это в контексте функции (потому что в моей реальной кодовой базе частичное применение функций является лишь одним из многих шагов). Примерно так:
// does NOT work as desired
function doPartials<
F extends {[funcName: string]: (arg1: number, ...rest: any[]) => any}
>(funcs: F) {
const newFuncs = _.mapValues(funcs, func => _.partial(func, 1))
return newFuncs
}
const result2 = doPartials(funcs)
Это не то, что я хочу. Typescript считает, что result2.add и result2.multiply принимают any [] и возвращают any. Я думаю, что мне нужны параметры doPartials для обеспечения того, чтобы каждая функция принимала число в качестве первого параметра (в противном случае машинопись выдает ошибку при вызове mapValues), но я не могу понять, как это сделать так, чтобы сохранить типы остальных параметров и возвращаемого значения.
Есть ли способ изменить doPartials, чтобы он не отбрасывал всю информацию о типе для предоставленных функций?