Я использую соглашения модуля CommonJS, так как я нацелен на node.js для тестирования и использования браузера, чтобы создать один .js-файл. В настоящее время мои модули циклически зависимы. То, что я хотел бы сделать, это указать, что модуль value
зависит от модуля pnode
, но только во время компиляции. То есть любая ошибка во время выполнения должна быть помечена как ошибка. Например. если модуль pnode
объявляет тип T, то в модуле value
я хотел бы, чтобы объявление, как var a : pnode.T
, компилировалось без ошибок, но выражение типа new pnode.T()
или a instanceof pnode.T
было бы ошибкой, потому что они создают зависимость во время выполнения.Машинопись. Могу ли я различать время компиляции и времени выполнения?
Есть ли способ сделать это?
Мотивация: В настоящее время 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;
То, что я пытался. Я надеялся, что замена линии
import pnode = require('./pnode') ; // Would like to avoid this.
с
/// <reference path="pnode.ts" />
может сделать трюк, но это не так. Существуют различные способы, с помощью которых я решил исключить круговую зависимость времени компиляции, так что это мой вариант падения.
Вы можете сделать файлы компилятора '.d.ts' для своих модулей, а затем ссылаться на' pnode.d.ts' с 'value.ts'. Таким образом вы сообщаете компилятору, что «эти определения в порядке и будут присутствовать во время выполнения».Другой вариант - переместить все общие типы из этих файлов на третий, скажем, «shared», тогда оба этих модуля будут ссылаться на «shared», и вы избегаете циклической зависимости. –
@NitzanTomer Спасибо. Это звучит многообещающе. Я сгенерировал pnode.d.ts, удалил 'import pnode = require ('./pnode');' и добавил '/// ' вместо этого. Но теперь я получаю сообщение об ошибке, когда используется 'pnode.Label'. Ошибка: «Не удается найти пространство имен» pnode'' –