【问题标题】:Cannot resolve import from index.ts from script located in same directory无法从位于同一目录中的脚本解析从 index.ts 的导入
【发布时间】:2017-02-19 02:20:48
【问题描述】:

我正在开发一个用 TypeScript 2 编写的 angular 2 项目,我目前正面临导入机制的问题。

我项目的每个子文件夹里面都有一个“index.ts”文件,即导出该文件夹包含的类。

所以,在我的“app”目录中, 我有

  • app.component.ts
  • app.module.ts
  • app.routes.ts

然后,一个 index.ts 文件包含:

export * from './app.component';
export * from './app.module';
export * from './app.routes';

我的问题是我无法从位于同一目录中的文件导入导出的类。

例如,在我的 app.module.ts 中,我想导入应用组件。 如果我这样做:

import { AppComponent } from './app.component';

一切正常!在编译时和运行时没有错误。生活很酷,生活很美好。

但我无法做到以下几点:

import { AppComponent } from '.'; // or './', or even './index'

IDE (Visual Studio) 实际上正确解析了导入(编译时没有错误)。我什至可以从 Intellisence 获得自动完成功能...

但我在运行时收到此错误:

 Error: Unexpected value 'undefined' imported by the module 'AppModule'

我就是不知道为什么。

注意:从子文件夹的 index.ts 导入没有任何错误(例如,我可以从也有索引的 './core' 导入)。

提前谢谢你:)

【问题讨论】:

  • 你能告诉你你想做什么以及什么是目录结构吗?
  • 我收到了你的问题,我之前也遇到过同样的问题,但没有尝试解决,而是使用了第一种方法,使用 .\app.component..
  • @micronyks :我只想导入在 index.ts 文件中导出的类。这实际上可行,但当我尝试将它们导入位于同一目录中的脚本时却不行。 (我已经给出了我的简约目录结构)。
  • @BasheerAhmed 如果我无法解决问题,这就是我要做的 :)
  • 你在使用angular cli吗?

标签: angular typescript import dependency-resolver


【解决方案1】:

我正好有same issue

你似乎有循环依赖

当你写这个时:

import { AppComponent } from '.';

解析器转到 index.ts 并看到:

export * from './app.component';

然后它转到./app.component 并看到:

import { AppComponent } from '.';

所以它转到index.ts 并看到:

export * from './app.component';

等等等等……

奇怪的是你没有收到任何警告,而且,根据加载程序,它实际上可能第二次正确解析(所以第一次你得到未定义但在随后的调用中它正确解析) - 我已经花了 4小时,因为远不那么明显的循环依赖。我强烈认为 typescript 应该对这些事情提出警告,因为它是一个适当的蠕虫罐头。

【讨论】:

  • “奇怪的是你没有收到任何警告”,这就是为什么我们认为这是一个错误 :) 感谢您的回复!我已将脚本更改为直接指向“包含的类”文件。
  • @kipy,微软的人说这种行为depends on the loader, not on typescript。虽然他们有些正确,但我真的看不出有任何理由不发出警告 - 这是一个明显的潜在错误来源。
  • 我认为我们同意这一点。
【解决方案2】:

为避免循环依赖,请不要:

import { SomeClass } from './path/to/index';

直接使用文件路径:

import { SomeClass } from './path/to/some-class';

这不适用于您从 node_modules 导入的模块。

【讨论】:

    【解决方案3】:

    这可能是更清晰的错误消息。你安装了resharper吗?你能禁用它再试一次吗?

    如果是 resharper 错误,请在 Resharper 选项中设置 Typescript 的版本。

    我有一个 9.x 版本的 resharper,它只让我使用 Typescript 1.6。我必须更新到 10.x 才能到 2.0。

    【讨论】:

    • 我不使用 resharper。错误消息来自浏览器,而不是来自 IDE 或 typescript 编译器 (tsc)。该脚本与 VS (2.0) 中的内置 tsc 甚至与 angular-cli 包含的节点模块都可以很好地编译(使用“ng serve”为项目提供服务或使用“ng pack”打包时没有错误)出现错误仅在运行时,浏览时(无论我使用哪种浏览器)。感谢您的回复
    猜你喜欢
    • 2023-01-31
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    相关资源
    最近更新 更多