Проблема в том, что тип T
не ограничен, поэтому это может быть что угодно, вы можете передать туда number
, string
et c. Понятно, что вы не можете вызвать number
, как если бы это была функция.
Как вы обрабатываете T
в вашем коде, как если бы он был функцией с аргументом string
, для этого необходимо дать такое ограничение. Рассмотрим:
const efg = <T extends (a: string) => any>(callback: T, value: string) => callback(value)
Выше T
ограничен (ключевым словом extension) как функция, которая принимает string
и может возвращать что угодно. Это означает, что все функции, такие как string->number, string-> boolean, string->object
et c, в порядке.
Мы можем go продвинуться дальше и ограничить его (если вам нужно) и сказать, что наша функция только string->string
, и именно такая интерфейс задается типом fun
. Так что давайте расширим fun
:
const efg = <T extends fun>(callback: T, value: string) => callback(value)
Детская площадка