2012-10-19 76 views
1

下面介紹的代碼以其當前形式編譯並執行時沒有錯誤 - 但是,只要第19行的'getNextAsyncTasks'類型聲明被取消註釋,編譯器就會崩潰錯誤:TypeScript編譯器崩潰:publicMembers爲空或未定義

  1. 內部錯誤:無法獲得屬性「publicMembers」的值:對象爲空或未定義
  2. 內部錯誤:智能感知功能將被禁用。嘗試編輯源文件以恢復有效的編譯狀態。
  3. 無法獲得屬性的值 'publicMembers':對象爲空或未定義
  4. 命令 「」 C:\ Program Files文件(x86)的\微軟的SDK \打字稿\ 0.8.0.0 \ TSC 「......」退出代碼1.

雖然我知道如何避免它在這種情況下,錯誤不斷髮生,因爲我工作在我的代碼庫的其他領域。調試相當困難,因爲在我注意到它發生的時候,我經常做出大量的改變,並且沒有提示這個問題可能來自何時。

理想情況下,如果有人能讓我知道是什麼原因導致了這次事故的發生,那麼我可以更好地瞭解如何避免它/解決它。

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

這看起來像一個編譯器錯誤,我會提交一份報告here。我嘗試了很多方法來解決這個問題,但都沒有成功。這很有趣,因爲在您的示例中嘗試使用它之前,崩潰實際上並不會顯示。

+1

報告崩潰,鏈接供參考:http://typescript.codeplex.com/workitem/286 – nxn