2017-01-24 10 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'プロパティがありません。

この関数でタイプを正しく定義する方法はありますか?

私は2つのオプションが行くように見ることができます:

  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; 
} 

https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/angular/index.d.ts#L603を参照)

したがって、$timeout(process, 20)はTS2322のエラーをスローする、IPromise<IPromise<IResult>>を返します。しかし、あなたのコードはどのように機能しますか? $タイムアウトの実装を見てみると、私たちは答えを参照してください。

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

$timeoutは延期新しいを作成し、FNは約束を返したときに約束チェーンとして働いて、deferred.resolve(fn.apply(null, args));のようにそれを解決します。

ここで問題となるのは、$ timeoutの署名です! $タイムアウト署名がなければならない:

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で解決されました。 –

関連する問題