Как сохранить типы после частичного применения параметров функции в Typescript - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть несколько функций, и я хочу частично применить первый аргумент ко всем из них. Упрощенный пример:

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, чтобы он не отбрасывал всю информацию о типе для предоставленных функций?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...