TypeScript编译器崩溃:publicMembers为null或未定义

时间:2012-10-19 02:42:54

标签: typescript

下面给出的代码以当前形式编译并执行时没有错误 - 但是,只要第19行的'getNextAsyncTasks'的类型声明被取消注释,编译器就会崩溃并出现以下错误:

  1. 内部错误:无法获取属性“publicMembers”的值:object为null或undefined
  2. 内部错误:已禁用IntelliSense功能。尝试编辑源文件以恢复有效的编译状态。
  3. 无法获取属性“publicMembers”的值:object为null或undefined
  4. 命令“”C:\ Program Files(x86)\ Microsoft SDKs \ TypeScript \ 0.8.0.0 \ tsc“...”退出,代码为1。
  5. 虽然我知道在这种特殊情况下如何避免它,但是当我处理代码库的其他区域时,错误会一直无声地发生。它可能很难调试,因为当我注意到它发生时,我经常做出相当多的更改,并且没有暗示这个问题可能来自何处。

    理想情况下,如果有人能让我知道导致此次崩溃的原因,我会很感激,这样我就可以更好地了解如何避免它/解决它。

    module abstract {
        export interface ICallback {
            (...args: any[]): any;
        }
        export interface IAsyncOp {
            (callback: ICallback): any;
        }
    }
    
    export class Chain {
        task : abstract.IAsyncOp;
    
        constructor(...tasks : abstract.IAsyncOp[]) {
            if (tasks.length === 1)     this.task = tasks[0];
            else if (tasks.length > 1)  this.task = cb => this.sync(() => cb.apply(null, arguments), tasks);
            else                        this.task = cb => cb();
        }
    
        next(getNextAsyncTasks /*: (...args: any[]) => abstract.IAsyncOp*/) {
            return new Chain(
                (cb: abstract.ICallback) =>
                    this.task(
                        () => getNextAsyncTasks.apply(null, arguments)(cb);
                    )
            );
        }
    
        last(cb : abstract.ICallback) {
            this.task(cb);
        }
    
        sync(cb: (...resultArgs: IArguments[]) => void, tasks: abstract.IAsyncOp[]) {
            var resultArgs : IArguments[] = [], done = 0;
    
            var getCb = (i) => {
                return () => {
                    resultArgs[i] = arguments;
                    done++;
    
                    if (done === tasks.length) cb.apply(null, resultArgs);
                }
            };
    
            for (var i = 0, op; op = tasks[i]; i++) op(getCb(i));
        }
    }
    
    // use example
    new Chain( cb => setTimeout(() => cb("foo"), 60)
             , cb => setTimeout(() => cb("bar"), 10)
             ).next((op1, op2) => { console.log(op1, op2)
                                  ; return cb => setTimeout(() => cb(op1[0], op2[0]), 120)
                                  }
             ).next((foo, bar) => { console.log(foo, bar)
                                  ; return cb => setTimeout(() => cb(foo, bar, "baz"), 30)
                                  }
             ).last((foo, bar, baz) => console.log(foo, bar, baz));
    

    编辑:更新了“下一步”,因此参数的类型签名始终是正确的。

1 个答案:

答案 0 :(得分:1)

这看起来像编译器错误,我会提交报告here。我尝试了很多东西来解决它,但没有一个能奏效。这很有趣,因为在您尝试在示例中使用崩溃之前,崩溃实际上并不会显现。