Почему ссылка на неэкспортированный класс не приводит к ошибке переноса? - PullRequest
0 голосов
/ 09 апреля 2019

Я относительно новичок как в 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), чтобы сделать ее более строгой, это может быть полезно.

1 Ответ

0 голосов
/ 09 апреля 2019

Существует два типа исходных файлов в JavaScript и TypeScript: сценарии и модули .

Я цитирую справочник :

В TypeScript, как и в ECMAScript 2015, любой файл, содержащий import или export верхнего уровня, считается модулем.И наоборот, файл без каких-либо объявлений import или export верхнего уровня обрабатывается как сценарий, содержимое которого доступно в глобальной области (и, следовательно, также для модулей).

Например,Вы можете загрузить файл ClassToBeImported.js в тег <script> на веб-странице, и тогда класс ClassToBeImported будет доступен в качестве глобальной переменной.

...