2017-04-13 50 views
0

流说明下面返回voidnullify的类型不兼容。我想我错过了什么?通用高阶函数的不兼容流类型

import faker from 'faker' 

type P = 
    | string 
    | number 
    | boolean 

function voidnullify(func:() => P): ?P { 
    const random: number = faker.random.number({ 
    min: 1, 
    max: 10 
    }) 

    const result = func() 

    if (random <= 7) return result 
    else if (random <= 9) return null 
    else return undefined 
} 

function someBoolean() { 
    return true 
} 

function someString() { 
    return "hello" 
} 

function someNumber() { 
    return 1 
} 

let maybeNum: ?number 
let maybeStr: ?string 
let maybeBool: ?boolean 

maybeNum = voidnullify(someNumber) 
maybeStr = voidnullify(someString) 
maybeBool = voidnullify(someBoolean) 

回答

1

我觉得你正在做的事情,你试图做的只是不受支持。我不确定是否应该可以工作,但是当您试图只保留输入类型(它看起来像?)时,在Flow中执行该操作的正确方法是使用有界多态+通用参数:

type P = 
    | string 
    | number 
    | boolean 

function voidnullify<A: P>(func:() => A): ?A { 
    const random: number = faker.random.number({ 
    min: 1, 
    max: 10 
    }) 
    ... 
+0

如果我将P更改为X,或者如果我删除了某个联合类型,Flow仍会告诉“无错误”,这是误报。 –

+0

对不起nvm,它实际上工作,非常感谢 –