2017-07-18 62 views
0

我想有一个通用的函数,它(() => T) | T类型的参数流的类型,比如定义排除特定类型的

const myGenericFunction = <T>(param: ((() => T) | T)): T => { 
    if (typeof param === 'function') { return param(); } 
    return param; 
}; 

然而,在这种情况下,流量不知道,如果我通过参数() => 1,然后Tnumber,而不是() => number。我如何才能帮助流程理解T不应该是一个功能?

+0

你能否澄清你得到的错误?看着[测试示例](https://flow.org/try/#0PQKgBAAgZgNg9gdzCYAoVBjOA7AzgFzAFsBPAcQFNsKAnASwwDEBXbDfOnMAXjAB4AKgD4AFAAcAhjQlEAXGBGKAlDyFgBKgD7qlS+QNVgA3qjBg6UBfhJiKcS5OlEe3XgHIordp2xuVRsBoKfGYabDBHGRElAG4wAF9TQODQ8MiiGNR4zLNc3KS8s1QANykwfHlsZiIAI1oeYnIqWgYWNg4cZUMARligA),似乎功能。 – loganfsmyth

回答

0

Flow不包含“not”类型(如$Not<Function>),所以我不认为有一个完全通用的方法来执行此操作。但是,如果T只能是一个类型的子集,你可以用绑定的泛型实现这一点:

const myGenericFunction = <T: number | string | {}>(
    param: ((() => T) | T) 
): T => { 
    if (typeof param === 'function') { return param(); } 
    return param; 
};