打字稿编译器崩溃:Publicembers为空或未定义



以下编译和执行的代码在其当前形式中没有错误 - 但是,一旦第19行的'getNextAsyNCtasks'的类型声明':

  1. 内部错误:无法获得属性的"公众"的价值:对象为空或未定义
  2. 内部错误:Intellisense功能被禁用。尝试对源文件进行编辑以还原有效的汇编状态。
  3. 无法获得属性的" pipermembers"的价值:对象为无定义
  4. 命令" C: Program Files(X86) Microsoft SDKS Typescript 0.8.0.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));

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

这看起来像一个编译器错误,我将在此处提交报告。我尝试了许多事情来围绕它工作,但它们都没有起作用。这很有趣,因为在您尝试在示例中使用它之前,崩溃实际上不会显现。

最新更新