2017-01-24 1 views
3

우리는 여전히 1.5.8 각도를 사용하고 부품에 긴 계산을 나누는 함수를 작성하려고합니다.TypeScript에서 약속을 반환하는 재귀 함수를 정의하는 방법

interface IResult { 
    add(s: string): void { ... } 
} 

function buildResult(): IResult { ... } 
function handleItem(s: string): string { ... } 

function doWork(data: string[]): ng.IPromise<IResult> { 
    let i = 0; 
    const result = buildResult(); 

    const process =(): ng.IPromise<IResult> => { 
     for(let start = i; i < start + 100; ++i) { 
      const item = data[i]; 
      if(!item) { 
       return $q.resolve(result); 
      } 
      result.add(handleItem(item)); 
     } 

     return $timeout(process, 20) 
    } 

    return process(); 
} 

이 작동하지만, 각도 $ 제한 시간 서비스가 값을 반환하는 함수를 사용할 수 있기 때문이며, 타이프 라이터 컴파일러는 불평하지 약속 : 약속은 약속을 돌려 기능을 체인 될 수 있기 때문에, 그처럼 쓰는 생각 :

TS2322 : 'IPromise < IPromise>'유형을 'IPromise'유형에 할당 할 수 없습니다. 'IPromise < IResult>'속성에 'add'속성이 없습니다.

이 함수에서 유형을 올바르게 정의 할 수있는 방법이 있습니까?

나는 두 가지 옵션이 가고 볼 수 있습니다

  1. 프로세스가 돌아 정의 any
  2. 캐스트 return 문 :

return $timeout(process, 20) as any as ng.IPromise<IResult>

어떤 더 나은 아이디어?

답변

0

$ 제한 시간 서명은 다음과 같습니다

interface ITimeoutService { 
    (delay?: number, invokeApply?: boolean): IPromise<void>; 
    <T>(fn: (...args: any[]) => T, delay?: number, invokeApply?: boolean, ...args: any[]): IPromise<T>; 
    cancel(promise?: IPromise<any>): boolean; 
} 

는 따라서, $timeout(process, 20) TS2322 오류를 던져 IPromise<IPromise<IResult>>를 반환 (https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/angular/index.d.ts#L603 참조). 하지만 코드가 어떻게 작동합니까?

... 
deferred.resolve(fn.apply(null, args)); 
... 

$timeout 새가 연기 만들고 FN이 약속을 반환 할 때 약속 사슬로 일하고, deferred.resolve(fn.apply(null, args));처럼 해결 : $ 제한 시간 구현을 보면 우리는 대답을 참조하십시오.

그래서 문제는 $ 타임 아웃 서명입니다! $ 제한 시간 서명이 있어야한다 :

interface ITimeoutService { 
    (delay?: number, invokeApply?: boolean): IPromise<void>; 
    <T>(fn: (...args: any[]) => T | IPromise<T>, delay?: number, invokeApply?: boolean, ...args: any[]): IPromise<T>; 
    cancel(promise?: IPromise<any>): boolean; 
} 

예시 테스트 케이스

here를 볼 수 있습니다.

+0

https://github.com/DefinitelyTyped/DefinitelyTyped/pull/15364 여기에서 해결되었습니다. –

관련 문제