私はcommon.jsモジュールの規則を使用しています。これは、テスト用に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;
:
/// <reference path="test.d.ts" />
module value {
export class ClosureV {
constructor(func : pnode.Label) {}
}
}
をあなたが説明したエラーを取得します:あなたが宣言フラグでpnode.ts
をコンパイルする場合
モジュールの '.d.ts'ファイルをコンパイラに出力させ、' value.ts'から 'pnode.d.ts'を参照することができます。そのようにすれば、コンパイラには「これらの定義は正常であり、実行時に存在します」と伝えられます。もう一つの選択肢は、これらのファイルからすべての共有タイプを第3のものに移動し、 'shared'と言うと、これらのモジュールの両方が' shared'を参照し、循環依存を避けることです。 –
@NitzanTomerありがとうございました。これは有望ですね。私はpnode.d.tsを生成し、 'import pnode = require( './ pnode');'を削除し、代わりに '/// 'を追加しました。しかし、今は 'pnode.Label'が使われているところでエラーが出ます。エラーは '名前空間が見つかりません 'pnode'' –