我使用CommonJS模塊約定,因爲我將node.js作爲測試目標,並使用browserify創建單個.js文件。目前我的模塊是循環依賴的。我想要做的是指示模塊value
取決於模塊pnode
,但僅在編譯時。即任何運行時依賴性都應該標記爲錯誤。例如。如果模塊pnode
聲明瞭類型T,那麼在模塊value
中,我希望像var a : pnode.T
這樣的聲明可以無誤地編譯,但是像new pnode.T()
或a instanceof pnode.T
這樣的表達式可能會出錯,因爲它們會創建運行時相關性。Typescript。我可以區分編譯時和運行時依賴
有沒有辦法做到這一點?
動機:目前pnode
和value
是循環依賴的。沒關係,只要在運行時沒有循環依賴。運行時的循環依賴會導致一個問題,因爲node.js不能正確處理它,甚至不會警告它。我當前的代碼看起來像這樣
文件pnode.ts
import value = require('./value') ;
module pnode {
export abstract class Label {
}
export class LambdaLabel {
step() {
return new value.ClosureV(this) ;
}
}
}
export = pnode ;
文件value.ts
import pnode = require('./pnode') ; // Would like to avoid this.
module value {
export class ClosureV {
constructor(func : pnode.Label) {
if (func instanceof pnode.Label) // Would like an error here.
console.log("a") ; else console.log("b") ;
}
}
}
export = value;
我已經試過。我希望用
/// <reference path="pnode.ts" />
更換線
import pnode = require('./pnode') ; // Would like to avoid this.
可能做的伎倆,但事實並非如此。我已經考慮過多種方法來消除編譯時循環依賴,所以這是我的後退選項。當你引用它
declare module pnode {
abstract class Label {
}
class LambdaLabel {
step(): any;
}
}
export = pnode;
然後:
您可以使編譯器輸出模塊的'.d.ts'文件,然後引用'value.ts'中的'pnode.d.ts'。這樣你就告訴編譯器「這些定義是可以的,並且會在運行時出現」。另一種選擇是將所有共享類型從這些文件移動到第三個文件,比如'shared',然後這兩個模塊都會引用'shared',並且避免循環依賴。 –
@NitzanTomer謝謝。聽起來很有希望。我生成了pnode.d.ts,刪除了'import pnode = require('./ pnode');',並在其位置添加了'///'。但是現在我在使用'pnode.Label'的時候出現錯誤。錯誤是'無法找到命名空間'pnode'' –