【问题标题】:Can't import exported functions无法导入导出的函数
【发布时间】:2018-09-17 20:21:04
【问题描述】:

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

为什么一个函数在导出后会不再是一个函数?我在课堂上也遇到过类似的问题。

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

例如,我在这里遇到了与 sequelize-typescript 类似的问题:my github issue with typescript-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 {}

最奇怪的是当我将provideSingletonTestService 放在同一个文件中时,一切正常!?!?!

基本上要重新创建问题,只需按照此处的示例进行操作:inversify-binding-decorators - Using @provideFluent multiple times。但是该示例存在问题,因此请参阅此问题:fluentProvide example needed。以上provideSingleton反映了该问题的变化。然后,您只需从另一个文件中导入 provideSingleton 函数,而不是像示例中那样定义它。

谁能向我解释我错过了什么?为什么哦,为什么某些出口项目不会被视为它们的类型?有没有我没有看到 NodeJS 采取的步骤来使项目实际导出并因此有所不同?我可以强制函数解析为函数,以便可以这样使用吗?

环境:
NodeJS:10.9.0
打字稿:3.0.1
Mac:10.13.16

【问题讨论】:

  • 你怎么知道“它不再是一个函数”了。我的意思是,准确的错误消息及其位置将使回答您的问题变得更容易。
  • 我只是得到一个错误说,provideSingleton 不是一个函数。我想我想通了,见下文。
  • 是的,请写出解决方案,这对我来说也很有趣

标签: node.js typescript import decorator inversifyjs


【解决方案1】:

因此,当 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 大部分时间都处理递归导入,但您仍然可以将其排除在外。

【讨论】:

  • 如果我理解正确的话,它通常不是“递归导入”,而是“循环依赖”。
猜你喜欢
  • 2019-12-11
  • 1970-01-01
  • 2013-10-04
  • 1970-01-01
  • 2018-02-24
  • 1970-01-01
  • 1970-01-01
  • 2021-09-18
  • 2017-05-04
相关资源
最近更新 更多