函数表达式的流泛型类型(箭头函数)

nor*_*tpy 13 javascript generics parameterized-types flowtype arrow-functions

我通常会尝试将流函数类型与其实现分开.我写的时候可读性稍高一些:

type Fn = string => string;
const aFn: Fn = name => `hello, ${ name }`;
Run Code Online (Sandbox Code Playgroud)

而不是:

const aFn = (name: string): string => `hello, ${ name }`;
Run Code Online (Sandbox Code Playgroud)

使用泛型类型时,我们可以写:

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

const jString: string = j('apple'); // ?
const jNumber: number = j(7);       // ?
Run Code Online (Sandbox Code Playgroud)

但是如何将这种类型与函数表达式分开?

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
Run Code Online (Sandbox Code Playgroud)

应该用*什么?any会工作,但这不是我想要的.

在haskell中,这是一个非问题:

identity :: a -> a
identity a = a

identity "a-string" // ?
identity 666        // ?
Run Code Online (Sandbox Code Playgroud)

flow.org/try

nor*_*tpy 8

所以我注意到如果我使用有界泛型,它会起作用:

type H<T> = <T: *>(input: T) => T;
const h:H<*> = i => i;

const a: string = h('apple');      // ?
const b: number = h(7);            // ?
const c: {} = h({ nane: 'jon' });  // ?
Run Code Online (Sandbox Code Playgroud)

不要问我为什么.