2017-02-24 98 views
1

我使用打字稿2.1.5與Visual Studio 2015年該項目被配置爲使用「ES 2015」模塊系統和ECMAScript 6需要與打字稿模塊/命名空間進口

我試圖幫助使用角度本地存儲模塊,這是由DefinitelyTyped as定義:

declare module 'angular' { 
    export namespace local.storage { 
     interface ILocalStorageService { 
     } 
    } 
} 

在我的服務之一,我想導入接口,這樣我就可以使用它,就像這樣:

module Foooooo.Services { 
    export class FooService { 
     constructor(private localStorageService: local.storage.ILocalStorageService) { 

     } 
    } 
} 

我用盡了一切我能想到的澆注文件結束後:

import local from "angular";       // bzzzzzt 
import * as ang from "angular";      // causes all of my other interfaces to no longer resolve 
import { local } from "angular";      // doesn't compile 
import { ILocalStorageService } from "angular";  // other interfaces don't resolve anymore 
import { local.ILocalStorageService } from "angular"; // nopenope 
import ILocalStorageService = require("angular");  // error: not compatible with ECMAScript 6 or higher 

我如何得到這個正確導入?

回答

1

你可以看到我的解決方案here。運行npm install,然後運行npm run build,親自看看它是否正確編譯。

有兩種方法可以解決這個問題。您可以使用模塊(以前稱爲「外部模塊」)或名稱空間(以前稱爲「內部模塊」)。有2個*.ts文件在每個方法的回購中有相應的名稱。

module.ts中,您明確指出了import的2個依賴關係:angularangular-local-storageangular-local-storage"side effect" import,因爲它會修補angular而不導出任何新內容。在import 'angular-local-storage',importedAngular(該變量持有exportangular編輯)現在知道angular-local-storage提供的額外屬性/方法。

namespace.ts中,您的問題中顯示的樣本只有輕微的變化。由於angularexports a global type angular(與script標籤配合使用),您可以使用該類型。由於對於「項目」(任何具有tsconfig.json的目錄)中的「內部模塊」/名稱空間,TypeScript將在編譯時包括所有d.ts文件,當然也包括這些d.ts文件之一(即在@types/angular-local-storage內)「增加」angular全局類型。實際上,如果您刪除node_modules中的@types/angular-local-storage,編譯將失敗namespace.ts

您應該更喜歡命名空間方法的模塊方法,因爲那裏的許多軟件包不提供UMD全局類型,導致後一種方法失敗。