tipo genérico de fluxo para expressão de função (funções de seta)

Normalmente, tento manter os tipos de função de fluxo separados de sua implementação. É um pouco mais legível quando escrevo:

type Fn = string => string;
const aFn: Fn = name => `hello, ${ name }`;

ao invés de:

const aFn = (name: string): string => `hello, ${ name }`;

Ao usar tipos genéricos, podemos escrever:

const j= <T>(i: T): T => i;

const jString: string = j('apple'); // √
const jNumber: number = j(7);       // √

Mas como posso separar esse tipo de uma expressão de função?

type H<T> = (input: T) => T;
const h:H<*> = i => i;              // --> WHAT SHOULD GO FOR '*'?

const hString: string = h('apple'); // X error
const hNumber: number = h(7);       // X error

Para que deve ser utilizado*? any funcionaria, mas não é isso que eu quero.

No haskell, isso não é problema:

identity :: a -> a
identity a = a

identity "a-string" // √
identity 666        // √

Vejoflow.org/try

questionAnswers(3)

yourAnswerToTheQuestion