2017-02-07 115 views
1

我正在使用TypeScript和WebPack。在TypeScript中使用靜態類型動態加載模塊的正確方法

有一個模塊需要動態加載。 目前的解決方案是:

declare function require(module: string): any; 

const m = require("./something"); 
m.f(); 

但這種方式我失去我的靜態類型相比:

import {f} from "./something"; 

是否與我的模塊型,將動態加載模塊的方式?

回答

0

我想你在找什麼是使用

import * as something from './something' 
    something.fn() 

否則請詳細說明你的問題。

有在Typesscript

提供多種類型的進口
import {something} from './something' //represents a named class or function 
    something from './something' //represents a default export from a module 
    import * as something from './something' // is equivalent to let method=require("something") 

請看這裏https://www.typescriptlang.org/docs/handbook/module-resolution.html

更新

編譯器檢測發射JavaScript的各個模塊是否使用了完整的參考。如果模塊標識符只被用作類型註釋的一部分,而不是作爲表達式使用,則不會爲該模塊發出調用請求。未使用引用的這種省略是一個很好的性能優化,並且還允許可選地加載這些模塊。

根據文檔,這可以通過systemjs,requirejs和node來處理。

//node 
If(...){let a=require('something')} 
//system 
If(...){require(['something'],(a))=>{...}} 
+1

import將添加一個靜態模塊。這意味着模塊將在我導入時立即加載。我只想在需要時延遲加載它。 –

+0

問題在於打字。我有模塊輸入爲'任何'。 –

0

我有一個部分解決方案:

import * as Something from "something"; //this will give you access to type 

if(..) { 
    let a: typeof Something = require("something") 
} 

然而有一個這樣的問題是,如果「東西」模塊具有接口或暴露類型,它們將不被顯示爲「一部分類型的東西「。所以如果有人會幫助這個,那會很棒!

0

我只需鍵入require 聲明函數require(s:「jquery」):JQueryStatic;

不完美,但不夠好。

相關問題