2016-05-06 111 views
8

Typescript沒有找到該模塊在此導入import ga from 'googleAnalytics';打字稿無法找到已映射與SystemJS模塊

SystemJS知道在哪裏可以找到該模塊,因爲它已經被映射到前面,像這樣:

map: { 
    '@angular': 'node_modules/@angular', 
    'rxjs': 'node_modules/rxjs', 
    'underscore': 'node_modules/underscore/underscore-min.js', 
    'googleAnalytics': '//www.google-analytics.com/analytics.js' 
}, 

如何提供類似於tsc的映射?

這個其他問題似乎在往好的方向指向:How to avoid imports with very long relative paths in Angular 2?

Typescript 2.0似乎支持paths配置爲tsconfig.json。有沒有辦法下載Typescript 2.0?我可以給path配置一個http url(//www.google-analytics.com/analytics.js),就像我在做SystemJS一樣嗎?如果無法下載Typescript 2.0,我如何才能達到我想要的當前版本?

編輯

特定的錯誤我得到的是:「找不到模塊‘嘎’」。

這裏是我的tsconfig.json

{ 
    "compilerOptions": { 
     "rootDir": "./", 
     "target": "es5", 
     "module": "system", 
     "moduleResolution": "node", 
     "emitDecoratorMetadata": true, 
     "experimentalDecorators": true, 
     "noImplicitAny": true 
    }, 
    "exclude": [ 
     "node_modules", 
     "front-end/node_modules", 
     "typings/main", 
     "typings/main.d.ts" 
    ] 
} 
+0

我不我認爲Typescript 2已經發布了。 https://github.com/Microsoft/TypeScript/tags – jasonszhao

+0

事實上,它看起來並不像它已經發布。 – maximedupre

+0

如果您像這樣從'googleAnalytics'導入{ga},那麼會發生什麼情況;' – iberbeu

回答

1

我想你明白,在打字稿的情況下,編譯轉譯器正在尋找definitly類型的文件。他需要知道外部模塊的類型定義。如果你有活動的nodejs模塊解析(你有),並且你使用非相對路徑(你這樣做),你必須添加到你的項目node_modules目錄(也許你已經有了),並且在這個目錄中添加googleAnalytics.d.ts文件,或者您可以創建node_modules/googleAnalytics目錄,然後在其中添加index.d.ts。定義類型爲谷歌分析可以從DefintelyTyped repository下載

約模塊分辨率

更多信息here

編輯:根據您的評論也許你將不得不MODUL出口添加到谷歌定義文件

declare module 'googleAnalytics' { 
    export = UniversalAnalytics; 
} 
+1

在'node_modules'中手動創建文件夾是非常糟糕的做法。你應該很少(如果不是永遠不)修改這個文件夾。打字稿編譯器也尋找[ambiant module declaration](https://www.typescriptlang.org/docs/handbook/modules.html#working-with-other-javascript-libraries),這是@jasonszhao提出的,但它看起來像谷歌分析類型定義不會導出任何東西。 – maximedupre

+1

非常好,我不知道。 –

+0

作爲您的編輯後續行動:您是對的,但它會是'export = ga'而不是'export = UniversalAnalytics'。乾杯! – maximedupre

1

這個問題可以與周圍Typescript Type Definitions進行合作。

要使用的定義:

  1. 把類型定義在目錄中。預製的由DefinitelyTyped提供。
  2. 此行添加到需要導入谷歌Analytics(分析)中的.ts文件:

    /// <reference path="ga.d.ts" /> 
    

更新

它沒有工作對我來說,當我跑tsc 。對不起,我忘了補充:

  1. 重構爲 s和SystemJS映射中的ga

這並不會讓編譯器知道它需要檢查SystemJS文件,而只是用作導入模塊的佔位符,這樣就不會引發任何錯誤,我們實際上可以在運行時解析模塊與SystemJS。

+0

我不認爲這會起作用,但我仍然嘗試過(並且它不起作用)。這個'd.ts'文件如何假設告訴'tsc'找到'googleAnalytics'模塊,它需要查看SystemJs映射(或者至少有相同的映射)?也許它不需要知道映射,但只能找到相應的'd.ts'文件,但'tsc'編譯器如何將自定義模塊名稱(如googleAnalytics')鏈接到'ga.d.ts'? – maximedupre

+0

@maximedupre我更新了我的答案。 – jasonszhao

+0

它仍然沒有工作,也許是因爲'd.ts'沒有聲明模塊? https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/google.analytics/ga.d.ts – maximedupre