Я относительно новичок как в Typescript, так и в Javascript (и node.js) из опыта Java, но быстро учусь мучительно. Недавно я преобразовал один гигантский файл Typescript с несколькими классами в несколько классов. Это заняло некоторое исследование, и я не претендую на полное понимание более 2 разных систем импорта Javascript. Но я использую синтаксис import {ClassName} from './{Classname}'
и проверяю, что Classname
начинается с export class ClassName
. Первоначально это работало отлично. В частности, исходя из фона Java и зависимости от ошибок компилятора, я понял, что Netbeans обнаружит ошибки в моем импорте, и tsc
согласился. Добавьте импорт, попробуйте еще раз, и все стало понятно.
Пока он не перестал работать, то есть ошибки не генерировались с неправильным (?) Кодом. Во время выполнения я получил ReferenceError: ClassToBeImportedis not defined
. Конечно же, ClassToBeImported
не импортировался. Я ожидаю, что добавление import {ClassToBeImported} from './{ClassToBeImported}
решит это. (Я прав? В данном случае ответ легче, чем тестирование.) Меня беспокоит то, что на этот раз это была ошибка времени выполнения вместо ошибки IDE / транспилятора.
При попытке создать минимальный пример, я думаю, проблема в том, что указанный файл не экспортировался. Если я добавлю / удалю export
из export class NeedsToBeImported
, ошибка возникнет / исчезнет.
Это приведет к ошибке (Cannot find name 'ClassToBeImported'.
):
// in file MainClass.ts
export class MainClass{
constructor(){
let x = ClassToBeImported.SOME_FIELD;
}
}
// in file ClassToBeImported.ts, same folder
export class ClassToBeImported{
static SOME_FIELD : string = "data";
}
Это не произойдет, пока время выполнения:
// in file MainClass.ts
export class MainClass{
constructor(){
let x = ClassToBeImported.SOME_FIELD;
}
}
// in file ClassToBeImported.ts, same folder
class ClassToBeImported{
static SOME_FIELD : string = "data";
}
Итак, основной вопрос - что за хрень происходит? («Почему ссылка на неэкспортированный класс не приводит к ошибке переноса?») Вторичный вопрос: могу ли я что-нибудь сделать, чтобы сделать это «более безопасным» для себя. Если есть какая-то опция, которую я могу включить в tsconfig.json
(в настоящее время нацелена на es2015), чтобы сделать ее более строгой, это может быть полезно.