/* @flow */ type $Function1 = (arg: A) => B; type _Function1Value> = B; // eslint-disable-line type $Function1Value, A> = _Function1Value; var toString = (value) => String(value) var toNumber = (value) => parseFloat(value) || 0 type NumberXString = ((value: number) => string) & ((value: string) => number) // var numberXString: NumberXString = (value: number | string) => { // if (typeof value === 'string') { // return 1 // } // return String(value) // } type ToStringRetVal = $Function1Value type ToNumberRetVal = $Function1Value ;(toString: (val: any) => ToStringRetVal) declare var x: ToStringRetVal declare var y: ToNumberRetVal ;(x: string) // $ExpectError ;(x: boolean) // $ExpectError ;(x: number) ;(y: number) // $ExpectError ;(y: string) function fnValueReturner> (fn: F, v: V): $Function1Value { return fn(v) } ;(fnValueReturner(toString, 1234): string) // $ExpectError ;(fnValueReturner(toString, 1234): number) type ShouldBeNumber = $Function1Value declare var num: ShouldBeNumber ;(num: number) // $ExpectError ;(num: string)