Как на TypeScript указать тип для фукнции?

142
02 декабря 2019, 06:40

Мне нужно написать на 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, что бы это работало...

Answer 1

Совместными усилиями нашли:

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[]} и срезультатом работы функции можно будет нормально работать.

READ ALSO
Проблема с массивом | Discord Bot | NODE.js | JavaScript | discord.js

Проблема с массивом | Discord Bot | NODE.js | JavaScript | discord.js

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

145
Не отображает компонент в react js

Не отображает компонент в react js

пытаюсь вывести компонент через алерт по нажатии кнопки, но что-то не получается, что же делать?

145
Почему Swiper slider ломает сетку?

Почему Swiper slider ломает сетку?

коллегиУ меня проблема с установкой Swiper

137