2016-10-10 28 views
4

我正在處理用TypeScript 2編寫的angular 2項目,而我目前正面臨導入機制的問題。無法解析從位於同一目錄中的腳本的index.ts導入

我的項目的每個子文件夾裏面都有一個「index.ts」文件,即導出該文件夾包含的類。

所以,在我的 「應用程序」 目錄, 我

  • 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中導入app組件。 如果我這樣做:

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'進行導入,該文件也具有索引)。

謝謝您提前:) :)

+0

請問你可以告訴你想做什麼以及目錄結構是什麼? – micronyks

+0

我得到了你的問題,我早些時候有同樣的問題,但沒有試圖解決這個問題,而是使用第一種方法使用'。\ app.component' .. –

+0

@micronyks:我只想導入導出的類一個index.ts文件。這實際上工作,但不是當我試圖將它們導入位於同一目錄中的腳本時。 (我已經給我的簡約目錄結構)。 – kipy

回答

7

我的確是same issue。您好像有循環依賴

當你這樣寫:

import { AppComponent } from '.'; 

解析器去index.ts,看到這一點:

export * from './app.component'; 

所以後來它去./app.component,看到這一點:

import { AppComponent } from '.'; 

所以它去到index.ts,看到這個:

export * from './app.component'; 

等等等等...

什麼古怪這是你沒有警告,並根據裝載機,它實際上可能正確圍繞解決第二次(這樣第一次你會得到未定義的,但在隨後的調用中它可以正確解決) - 我已經花了4個小時,因爲一個不太明顯的循環依賴。我強烈認爲打字稿應該對這些事情提出警告,因爲它是一種適當的蠕蟲。

+0

「有什麼奇怪的是,你沒有得到任何警告」,這就是爲什麼我們認爲它是一個錯誤:)謝謝你的回覆!我已將腳本更改爲直接指向「包含類的」文件。 – kipy

+0

@kipy,微軟的人說這種行爲[取決於加載器,而不是打字稿](https://github.com/Microsoft/TypeScript/issues/4149#issuecomment-127797973)。雖然他們有些不對,但我並不認爲有任何理由不會提出警告 - 這是一個明顯的潛在錯誤來源。 – Izhaki

+0

我認爲我們同意這一點。 – kipy

0

這可能是一個resharper錯誤消息。你有安裝resharper嗎?你可以禁用它,然後再試一次嗎?

如果是resharper錯誤,則在Resharper選項中設置Typescript的版本。

我有一個9.x版本的resharper,它只讓我到Typescript 1.6。我不得不更新到10.x到2.0。

+0

我不使用resharper。錯誤消息來自瀏覽器,而不是來自IDE或打印機編譯器(tsc)。該腳本與VS(2.0)中的內置tsc編譯良好,甚至包含angular-cli的節點模塊(使用「ng serve」服務項目或使用「ng pack」打包時沒有錯誤)。只在運行時,瀏覽時(不管我使用哪個瀏覽器)。感謝您的回覆 – kipy

2

爲了避免循環依賴,只是不:

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

而是直接使用文件路徑:

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

這並不適用於您從node_modules導入模塊。