Как вы правильно обнаружили, невозможно использовать объявление функции в качестве типа generi c, невозможно применить generi c без выполнения функции. Мы можем применять generi c только во время вызова функции (или получим из аргумента):
const r1 = f<number>(1) // boolean
const r2 = f(1) // boolean
Хорошо, поэтому мы понимаем, что это невозможно. Теперь обходной путь, чтобы он работал без потери связи с оригинальным объявлением, я предлагаю дополнительный шаблон c type FType
. Рассмотрим:
type FType<T> = (t: T) => T extends number ? boolean : object;
// join function declaration with FType:
declare function f<T>(...t: Parameters<FType<T>>): ReturnType<FType<T>>
type ResForNumArg = ReturnType<FType<number>>; // bool
type ResForStringArg = ReturnType<FType<object>>; // object
Используя типы утилит Parameters
и ReturnType
, я связал FType
с объявлением функции f
. Это многословно, но мы наконец получаем то, что хотим, и FType
можно применять стандартным способом.
Playground link