2017-02-19 2 views
1

제가 잘못하고있는 것을 전혀 알지 못하지만 다형 함수로 작업하려고 할 때 나는 같은 벽인 some incompatible instantiation of에 계속 충돌합니다. 내가 뭘 잘못하고 있는거야?다형 함수를 검사 할 때`some incompatible instantiation`을 호출합니다

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

나는 종종 이런 오류로 난처한 상황에 빠진 것을 인정한다. 일반적으로이를 해결하기위한 나의 전략은 다음과 같습니다

  1. 코드에서 정말 열심히 응시하고 엉망 수 그 방법을 생각하려고하고, 오류가 사라지거나 내가 얻을 때까지
  2. 는 무상 유형의 주석을 추가 할 수 이해할 수있는 오류 메시지.

접근법 (1)을 성공없이이 스 니펫에 적용했습니다. 내가 한 모든 화살표 기능에 유형 약어를 추가 할 것을

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

참고 : 그러나, (2) 방식은 흐름이 통과하는이를 얻었다. 솔직히, 나는 Flow가 이것을 점검하는 데 어려움을 겪는 이유를 알지 못한다. 그러나 나는 너무 넓었던 어떤 타입을 유추하기를 기대한다.

관련 문제