`检查多态函数时{`的一些不兼容的实例化

时间:2017-02-19 19:53:40

标签: javascript flowtype

我不知道我做错了什么,但是当我尝试使用多态函数时,我一直在使用some incompatible instantiation of的同一个墙。知道我做错了吗?

Example

type EqualsBy = <Obj, Value>(Obj => Value, Value) => (Obj => boolean)
export const equalsBy: EqualsBy = (f, value) => (obj => f(obj) === value)

2: export const equalsBy: EqualsBy = (f, value) => (obj => f(obj) === value)
                                                              ^ Obj. This type is incompatible with the expected param type of
2: export const equalsBy: EqualsBy = (f, value) => (obj => f(obj) === value)                                     
                                      ^ some incompatible instantiation of `Obj`

编辑: 容易example出现同样问题:

type EqualsBy = <Obj, Value>(Obj => Value, Value, Obj) => boolean
export const equalsBy: EqualsBy = (f, value, obj) => value === f(obj)

1 个答案:

答案 0 :(得分:1)

我承认我经常被这样的错误所困扰。通常我解决它们的策略是:

  1. 严格盯着代码并试着想办法 它可能搞砸了,
  2. 添加免费类型注释,直到错误消失或者我得到更容易理解的错误消息。
  3. 我将方法(1)应用于此代码段但没有成功。然而,方法(2)产生了这个,流程通过:

    type EqualsBy = <Obj, Value>(Obj => Value, Value, Obj) => boolean;
    const equalsBy: EqualsBy = <Obj, Value>(f: Obj => Value, value: Value, obj: Obj) => (value === f(obj))
    

    请注意,我所做的只是向箭头函数添加类型注释。老实说,我不知道为什么Flow无法检查这个,但我希望它推断出某种类型太过宽泛。