Мне нужно написать на typeScript типы для функции, которая принимает объект config, в свойствах которого записаны функции, а возвращает объект с теме же свойствами что и config, но в значениях записаны результат выполнения функции:
function init (config) {
return Object
.keys(config)
.reduce((prev, key)=>
{
prev[key] = config[key]()
return prev
}, {})
}
Подскажите, пожалуйста, как на TypeScript можно описать тип такой функции?
Т.е. функция init как бы будет библиотечная, и другие разработчики, смогут её вызывать, например, вот так:
let temp = init({a:()=>5 as number, b:()=>[3,4] as number[]}).
Тогда в temp будет записан объект {a:5, b:[3,4]}, и хочется что бы typescript автоматически вывел его (temp) типы, и ругался бы, например, на вызов temp.a.map() т.к. в свойстве 'a' объекта temp находится число, а не массив т.к. в параметре функции init в свойстве 'a' была функция, которая возращает число, следовательно после выполнения функции init там будет число. Хочется понять, как можно указать типы для функции init, что бы это работало...
Совместными усилиями нашли:
function init<T extends { [k: string]: () => any }>(config: T):{[r in keyof T]:ReturnType<T[r]>} {....}
И это работает, после вызова, например
let temp = init({a:()=>5 as number, b:()=>[3,4] as number[]}).
TypeScript автоматически выведет для temp тип {a:number, b:number[]} и срезультатом работы функции можно будет нормально работать.
Продвижение своими сайтами как стратегия роста и независимости