无法导入导出的功能

时间:2018-09-17 20:21:05

标签: node.js typescript import decorator inversifyjs

当我从导出文件的文件中导入内容时,Typescript出现了奇怪的问题。有时我会导出一个函数,然后将其导入到另一个文件中,然后使用该函数,它不再是一个函数。当我在同一文件中定义函数时,突然该函数就是一个函数?!?!!?

为什么函数在导出时会停止成为函数?我在课堂上也遇到过类似的问题。

这个问题的难点是我无法重新创建一个简单的示例,因为它仅在我使用某种更高级别的程序包时发生。

例如,我在这里使用sequelize-typescript存在类似问题:my github issue with typescript-sequelize

下面是一些代码,这些代码演示了InversifyJS的装饰器之一存在的基本问题。

container.ts

_.map(_.pickBy(state.classes, (val, key)=>...), (val, key) => ...)

test.service.ts

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

最奇怪的是,当我将import {provideSingleton} from './container' @provideSingleton(TYPES.TEST) export default class TestService {} provideSingleton放在同一文件中时,一切正常!?!?!

基本上是要重新创建问题,只需遵循此处的示例:inversify-binding-decorators - Using @provideFluent multiple times。但是该示例存在问题,因此请参见以下问题:fluentProvide example needed。以上TestService反映了该问题的更改。然后,您只需从另一个文件导入provideSingleton函数,而不用像示例中一样定义它。

有人可以向我解释我所缺少的吗?为什么哦,为什么某些出口物品不会被视为它们的类型?我没有看到NodeJS采取步骤使项目实际导出并因此与众不同的步骤吗?我可以强制将该函数解析为一个函数,以便如此使用吗?

ENV:
NodeJS:10.9.0
打字稿:3.0.1
Mac:10.13.16

1 个答案:

答案 0 :(得分:0)

因此,当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在大多数情况下都处理递归导入,但是您仍然可以跳出它。