2017-04-23 4 views
0

나는 예를 제외하고 내 주요 기능의 유형에 정직에제네릭에 함수라고 말해야합니까?

const main = <T>(root: T) => <K extends keyof T>(method: K, ...args: any[]) => { 
    root[method].apply(this, ...args); 
}; 

를 'T [K]' 존재하지 않는 오류 속성이 '적용'이 있습니다

const main = <T>(root: T) => <K extends keyof T>(method: K, ...args: any[]) => { 
    (<any>root[method]).apply(this, ...args); 
}; 

UPDATE를

아마도이 말은하지 않았지만 나는이 예를 의미했습니다 ...

UPDATE 2

LEVEL3 및 방법 레벨 4 (만)/5 번째 호출 - works perfectly!

내가 다른 유형의 level6를 추가하는 경우 (수) - everything collapses :(

이 그리고 그것은 매우입니다 흥미로운 이유는 첫 번째 전화가 항상 시간 오류? 당신이 운전을 할 경우이 경우

- 모든 결과는 '갑'과 '바'는 작동하지만 컴파일러 타이프 라이터는

+0

나는 제네릭 함수가 전혀 필요 없다고 생각합니다. 당신이 찾고있는 것이 매우 구체적 인 것 같습니다. 제가 누락 된 것이 있습니까? –

+0

다음과 같은 결과가 얻어진다. 새 예제에서는 UPDATE 2 –

+0

구조가 매우 구체적입니다. 어떤 솔루션을 일반적인 것으로 만드는 것은 의미가 없습니다. 당신은 일을 너무 많이 끝내고 이해하기 어렵고 필요 이상으로 많은 코드를 포함하고 특정 솔루션보다 성능이 떨어지는 솔루션으로 끝날 것입니다. 나는 그 아이디어를 포기할 것을 강력히 권합니다. –

답변

0

당신은이 작업을 수행 할 수있는 오류를 생성합니다

const main = <T extends { [key: string]: Function }>(root: T) => <K extends keyof T>(method: K, ...args: any[]) => { 
    root[method].apply(this, args); 
}; 

(code in playground)

확산 연산자를 사용해서는 안되기 때문에 Function.prototype.apply()은 배열을 두 번째 인수로 기대합니다.

+0

답변 주셔서 감사합니다. 업데이트로 응답했습니다 (stackoverflow는 긴 링크가 주석에 삽입되는 것을 허용하지 않습니다). –