2017-04-13 53 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,它實際上工作,非常感謝 –