![](/img/trans.png)
[英]Typescript | TypeError: __WEBPACK_IMPORTED_MODULE_1_signature_pad__ is not a constructor
[英]Defining an imported external module with WebPack + TypeScript
我正在嘗試使用TypeScript和一些外部庫來設置WebPack,但是遇到了一些麻煩。
我正在導入jQuery的src版本,以便讓WebPack選擇所需的模塊(這是使Boostrap-SASS加載程序正常工作所必需的),因此在TS中導入這樣的庫:
import jquery = require( 'jquery/src/jquery.js' );
編譯時,拋出此錯誤, cannot find external module 'jquery/src/jquery'
。 如果我創建一個手動的.d.ts文件來定義庫,如下所示:
declare module "jquery/src/jquery"{}
然后編譯器可以工作,但是警告:
cannot invoke an expression whose type lacks a call signature
或者,如果我將導入行更改為
var jquery = require( 'jquery/src/jquery' );
(我認為這是CommonJS樣式的導入嗎?)然后全部編譯(並運行)。 所以,問題:
var
而不是import
或者在工作時滾動它嗎? 我只是選擇了WebPack,所以我很可能在做一些愚蠢的事情。 如果是這樣,請糾正我!
編輯:
當我在思考如何表達這個問題時,我想到了:
declare module "jquery/src/jquery" { export = $; }
這似乎讓我使用“導入...”-但這是處理此問題的好方法嗎?
編輯2:
回復下面的@basarat的回答(我的評論有點長,沒有換行符):
我已經在使用DefinitelyTyped的jquery def,但它本身無法工作,因為我需要的模塊是“ jquery / src / jquery”而不只是“ jquery” 。 如果我使用“ jquery”,則將加載jquery的已編譯發行版,這不適用於Bootstrap加載程序。
因此, declare module "jquery/src/jquery" { export = $; }
我認為declare module "jquery/src/jquery" { export = $; }
是擴展現有定義,但使用的是我需要從中加載的路徑。
import jquery = require('jquery / src / jquery.js');
使用絕對類型定義的jquery代替: https : //github.com/borisyankov/DefinitelyTyped/blob/master/jquery/jquery.d.ts#L3158-L3160已經允許您import jquery = require('jquery')
。
為了回答我自己的問題,這就是我最終要做的。
注意:我不知道這是否是實現此目標的“正確”方法(我懷疑不是),所以我願意接受答案更好的任何人!
在我的TS定義文件tsd.d.ts中,我有絕對類型的jQuery定義:
/// <reference path="jquery/jquery.d.ts" />
但是僅靠這還不足以使編譯器從node_modules文件夾中拾取jQuery源文件。
因此,我進一步添加了tsd.d.ts:
declare module "jquery/src/jquery"
{
export = $;
}
編譯器現在可以找到jQuery源文件。
我還必須編輯一個jQuery源文件,以使WebPack編譯器很好地使用它:默認情況下, selector.js不包含出廠函數,並且WebPack需要一個工廠函數。
有一個加載器說可以解決此問題,但是我無法使其正常工作,因此我只是將選擇器.js中的代碼更改為:
define([ "./selector-sizzle" ], function(){});
這一切都讓人覺得有些棘手...但是這讓我克服了這個特別的障礙。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.