Не могу импортировать экспортированные функции - PullRequest
0 голосов
/ 17 сентября 2018

У меня возникают странные проблемы с Typescript, когда я импортирую вещи из файла, который их экспортирует. Иногда я экспортирую функцию, затем импортирую ее в другой файл, затем использую функцию, и она больше не является функцией. Когда я определяю функцию в одном и том же файле, внезапно эта функция становится функцией?!?!?

Почему функция перестает быть функцией при экспорте? У меня были похожие проблемы с классами тоже.

Сложная часть этой проблемы - я не могу воссоздать простой пример, потому что это происходит только тогда, когда я использую какой-то пакет более высокого уровня.

Например, у меня была похожая проблема с sequelize-typcript здесь: моя проблема с github с typcript-sequelize

Ниже приведены некоторые коды, демонстрирующие основную проблему, которую я имею с одним из декораторов из InversifyJS.

container.ts

import {fluentProvide} from "inversify-binding-decorators";
export const provideSingleton = (identifier: any) => {
    return fluentProvide(identifier)
    .inSingletonScope()
    .done(true);
};

test.service.ts

import {provideSingleton} from './container'
@provideSingleton(TYPES.TEST)
export default class TestService {}

Самое странное, когда я помещаю provideSingleton в тот же файл, что и TestService, все работает!?!?!

В основном, чтобы воссоздать проблему, просто следуйте приведенному ниже примеру: inversify-binding-decorators - несколько раз используя @provideFluent . Однако в этом примере есть проблема, поэтому, пожалуйста, просмотрите эту проблему: Нужен пример fluentProvide . Приведенный выше provideSingleton отражает изменения этого вопроса. Затем вы просто импортируете функцию provideSingleton из другого файла, а не определяете ее так же, как в примере.

Может кто-нибудь объяснить мне, что мне не хватает? Почему некоторые экспортируемые товары не будут рассматриваться как их тип? Есть ли какой-то шаг, который я не вижу, чтобы NodeJS предпринял, чтобы сделать объект действительно экспортированным и, следовательно, другим? Могу ли я заставить функцию разрешаться как функцию, чтобы ее можно было использовать как таковую?

ENV:
NodeJS: 10,9,0
Машинопись: 3.0.1
Mac: 10.13.16

1 Ответ

0 голосов
/ 18 сентября 2018

Похоже, что вы можете получить такие проблемы, когда NodeJS не может обработать рекурсивный импорт. Я не совсем уверен, как проверить, что вы получаете эту ошибку, кроме тех симптомов, которые я описал выше. По сути, рекурсия заставила мою функцию не загружаться, и поэтому undefined не является функцией.

Было бы легко заметить, если бы у вас был такой код:

a.ts

import B from './b';
export default class A extends B {}

b.ts

import A from './a';
export default class B extends A {}

В моем случае, я думаю, что моей функции provideSingleton не понравился файл, в который я ее поместил, из-за некоторого противоречивого кода в файле, который у меня был:

import {Container} from 'inversify';
import "reflect-metadata";
import {fluentProvide} from "inversify-binding-decorators";
const container = new Container();
function ProvideSingleton(identifier: any) {
    return fluentProvide(identifier)
           .inSingletonScope()
           .done(true);
}
export {container, ProvideSingleton}

В конце концов, если возникнет эта проблема, попробуйте другой файл для вашей функции и обратите внимание на порядок загрузки. Хотя NodeJS большую часть времени обрабатывает рекурсивный импорт, вы все равно можете отключить его.

...