2017-02-19 4 views
1

Я понятия не имею, что я делаю неправильно, но при попытке работать с полиморфными функциями я продолжаю ударять по одной и той же стене 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` 

EDIT: Легче example с той же проблемой:

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

ответ

1

Я признаю, что я часто озадачены ошибками, как это. Обычно мои стратегии для их решений являются:

  1. смотреть очень тяжело на коде и попытаться подумать о том, что это может испортить, и
  2. добавить безвозмездную аннотацию типа, пока ошибки не исчезают или я получаю более понятное сообщение об ошибке.

Я применил подход (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 испытывает трудности с этим, но я ожидаю, что он предположил, что какой-то тип был слишком широким.

Смежные вопросы