在TypeScript中,如何定义返回承诺的递归函数

在TypeScript中,如何定义返回承诺的递归函数,typescript,promise,settimeout,Typescript,Promise,Settimeout,我们仍然使用angular 1.5.8,我尝试编写一个函数,将长时间的计算分解为部分。由于承诺可以与返回承诺的函数链接在一起,我想这样写: interface IResult { add(s: string): void { ... } } function buildResult(): IResult { ... } function handleItem(s: string): string { ... } function doWork(data: string[]): ng.

我们仍然使用angular 1.5.8,我尝试编写一个函数,将长时间的计算分解为部分。由于承诺可以与返回承诺的函数链接在一起,我想这样写:

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();
}
接口IResult{
添加(s:string):void{…}
}
函数buildResult():IResult{…}
函数handleItem(s:string):字符串{…}
函数doWork(数据:字符串[]):ng.IPromise{
设i=0;
const result=buildResult();
常量进程=():ng.IPromise=>{
for(让start=i;i
这是可行的,但TypeScript编译器会抱怨,因为Angular$timeout服务接受一个返回值而不是承诺的函数:

TS2322:类型“IPromise”不可分配给类型“IPromise”。类型“IPromise”中缺少属性“add”

是否有方法正确定义此函数中的类型

我可以看到两种选择:

  • 定义返回
    any
  • 转换返回语句:
  • 返回$timeout(进程,20)作为ng.IPromise的任意值

    有更好的主意吗?

    $timeout签名是:

    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
    创建一个新的deferred并像
    deferred.resolve(fn.apply(null,args))一样解析它,在fn返回承诺时充当承诺链

    所以,这里的问题是$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;
    }
    
    接口ITimeoutService{
    (delay?:number,invokeApply?:boolean):IPromise;
    (fn:(…args:any[])=>T | IPromise,delay?:number,invokeApply?:boolean,…args:any[]):IPromise;
    取消(承诺?:i承诺。

    在这里解决了。
    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;
    }