2017-09-10 7 views
2

내가 가지고 다음의 예 기능 (Ramda에서입니다 구성) :이처럼 사용하려고타이프 라이터 타입 추론 문제 함수가 반환이 작동 할 때

declare function compose<V0, T1, T2>(fn1: (x: T1) => T2, fn0: (x0: V0) => T1): (x0: V0) => T2; 

    interface User { 
     id: number 
    } 

    function fn1(input: any): User { 
     return {id: 1}; 
    } 

    function fn2<I, O>(fn: (i: I) => O): (i: I) => O { 
     return (data) => { 
     try { 
      return fn(data); 
     } catch (e) { 
      return undefined 
     } 
     }; 
    } 

가 :

compose(fn2(user => user.id), fn1); 

타이프 라이터가를 던졌습니다 다음과 같은 오류 :

TS2339:Property 'id' does not exist on type '{}'.

사람이 알것 않는다 w, TypeScript가 user에 적합한 유형을 추론하도록 도와 주려면 어떻게해야합니까?

compose<any, User, number>(fn2(user => user.id), fn1); 
+0

UPDATE를 , 적어도 버그는 아닙니다. [이 주석] (https://github.com/Microsoft/TypeScript/issues/15680#issuecomment-307571917)을 참조하십시오. – Deftomat

답변

1

그것은 외모와 :

이 작동합니다. 비슷하지만 기능이 반대 인이 코드를 살펴보십시오.

declare function compose<V0, T1, T2>(fn0: (x0: V0) => T1, fn1: (x: T1) => T2,): (x0: V0) => T2; 

interface User { 
    id: number 
} 

function fn1(input: number): User { 
    return {id: 1}; 
} 

function fn2<I, O>(fn: (i: I) => O): (i: I) => O { 
    return (data) => { 
    try { 
     return fn(data); 
    } catch (e) { 
     return undefined 
    } 
    }; 
} 

compose(fn1, fn2(user => user.id)); 

예상대로 작동합니다. 그러나 구성 정의는 변경되어야합니다.

편집

,이처럼 작성 체인에 들어가는 적어도 최초의 파라 메트릭 요소 티치아노 Cernicova의 대답과 유사하게 정의 할 수 있습니다 : 타이프 라이터 팀처럼 보이는이 동작 인식 :

declare function compose<T1 = any, T2 = any, V0 = any>(fn1: (x: T1) => T2, fn0: (x0: V0) => T1): (x0: V0) => T2; 

interface User { 
    id: number 
} 

function fn1(input: number): User { 
    return {id: 1}; 
} 

function fn2<I, O>(fn: (i: I) => O): (i: I) => O { 
    return (data) => { 
    try { 
     return fn(data); 
    } catch (e) { 
     return undefined 
    } 
    }; 
} 

compose<User>(fn2(user => user.id), fn1); 
+0

버그인지 또는 TypeScript의 제한인지 확실하지 않습니다. 당신의 생각에 따르면, [pipe] (http://ramdajs.com/docs/#pipe)를 사용하기로 결정했습니다.이 기능을 사용하면 역순으로 기능을 사용할 수 있습니다. – Deftomat

0

당신은 모든 유형을 지정할 필요가 없습니다하지만 당신은이 작업을 위해 user 매개 변수 유형을 지정해야합니다 : 물론

는, 다음 코드는 작동합니다.

compose(fn2((user: User) => user.id), fn1); 

당신은하지 작동합니다 fn2 형식 유추를 사용했지만, fn2의 인수가 Fn2를 반환 할하는 데 필요한 값을 기준으로 유형 (user:User)=> number이어야한다는 것을 결정하면 타이프 라이터에 대한 조금 너무 많은 경우 컴파일러. 당신이 어떤 함수에 어떤을 작성하기 때문에 먼저 해당 오류가 그 파라 메트릭 유형이 왼쪽에서 오른쪽으로 해결 같은

compose((user) => user.id, fn1);