tipo genérico de flujo para expresión de función (funciones de flecha)

Por lo general, trato de mantener los tipos de funciones de flujo separados de su implementación. Es un poco más legible cuando escribo:

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

más bien que:

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

Cuando usamos tipos genéricos podemos escribir:

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

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

Pero, ¿cómo puedo separar este tipo de una expresión de función?

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 qué se debe utilizar*? any funcionaría pero eso no es lo que quiero.

En Haskell esto no es un problema:

identity :: a -> a
identity a = a

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

Verflow.org/try

Respuestas a la pregunta(3)

Su respuesta a la pregunta