1
下面介紹的代碼以其當前形式編譯並執行時沒有錯誤 - 但是,只要第19行的'getNextAsyncTasks'類型聲明被取消註釋,編譯器就會崩潰錯誤:TypeScript編譯器崩潰:publicMembers爲空或未定義
- 內部錯誤:無法獲得屬性「publicMembers」的值:對象爲空或未定義
- 內部錯誤:智能感知功能將被禁用。嘗試編輯源文件以恢復有效的編譯狀態。
- 無法獲得屬性的值 'publicMembers':對象爲空或未定義
- 命令 「」 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));
編輯:更新'下一步',所以參數的類型簽名將永遠是正確的。
報告崩潰,鏈接供參考:http://typescript.codeplex.com/workitem/286 – nxn