2015-11-13 49 views
1

我正在使用Node.js的履帶我使用jQuery解析使用 jsdom製作的網頁。進口的jQuery

我發現了一個jquery.d.ts通過tsd,從而結束這樣的:

declare module "jquery" { 
    export = $; 
} 
declare var jQuery: JQueryStatic; 
declare var $: JQueryStatic; 

這個定義似乎只可用在哪裏jQuery是加載 全局或其中一個全局變量窗口可以客戶端...

如所解釋的here, 進口當在window.document是一個環境(使用require)不 可用(如Node.js的),jQuery的導出工廠itsel的其中有F進行 initalized一個窗口對象:

// JavaScript (ES5) 
var jquery = require("jquery"); 
// ... 
var $ = jquery(window); 

但隨着打字稿,自定義不包含這個工廠。它 不起作用:

// TypeScript 
import jquery from "jquery"; // Module '"jquery"' has no default export 
import {jquery} from "jquery" // Module '"jquery"' has no exported member 'jquery' 
import {jQuery} from "jquery" // Module '"jquery"' has no exported member 'jQuery' 
import {$} from "jquery" // Module '"jquery"' has no exported member '$' 
import * as jquery from "jquery"; // Doesn't complain here, but `jquery` variable is not usable 

我試着寫這個工廠的定義,但它似乎我因子評分不一樣簡單 :

interface JQueryFactory { 
    (window: any): JQueryStatic; 
} 

declare module "jquery" { 
    export default JQueryFactory; 
} 
declare var jQuery: JQueryStatic; 
declare var $: JQueryStatic; 

並使用它:

// TypeScript 
/// <reference path="../../typings/tsd.d.ts"/> 

import jquery from "jquery"; 
// ... 
var $ = jquery(window); // error TS2304: Cannot find name 'jquery' 

但現在我有這個奇怪的錯誤?!

回答

3

我回答我的問題:

我非常接近,現在,我的jquery.d.ts結束這樣的:

declare var jQuery: JQueryStatic; 
declare var $: JQueryStatic; 
declare function jQueryFactory (window: any): JQueryStatic; 
declare module "jquery" { 
    export default jQueryFactory; 
} 

我沒有成功實現這一目標,而不聲明jQueryFactory功能。

作爲一個小例子,它可以現在基本上使用這樣的:

import {env} from "jsdom"; 
import jquery from "jquery"; 

interface StuffInterface 
{ 
    title: string; 
    text: string; 
} 

function parse (url: string): Promise<StuffInterface> 
{ 
    return new Promise((resolve, reject) => { 
     env(url, (e, window) => { 
      if (e) { 
       reject(e); 
       return; 
      } 

      var $ = jquery(window); 
      var stuff = { 
       title: $('#stuff h1').text(), 
       text: $('#stuff .content').text() 
      }; 

      resolve(stuff); 
     }); 
    }); 
} 
+0

感謝您發佈自己的答案@Ascarius,請提供有關如何修復它的更多詳細信息?我面臨着同樣的問題。謝謝! – asheinfeld

+0

@asheinfeld我添加了一個基本的例子。 –

+1

太好了,謝謝@Ascarius!也許你應該爲jquery.d.ts做一個PR,這樣每個人都喜歡這個,乾杯! – asheinfeld

0

通過TypeScript 1.8.9而不污染jquery.d.ts

main.ts

require.config({ 
    baseUrl: '/js', 
    shim: { 
     jquery: { 
      exports: '$' // Trick here!!! 
     }, 
     underscore: { 
      exports: '_' // Trick here!!! 
     } 
    }, 
    paths: { 
     jquery: 'lib/jquery.min', 
     underscore: 'lib/underscore.min' 
    } 
}); 

require(['foobar'], function (foobar) { 
    foobar.runMe(); 
}); 

foobar.ts

import 'jquery'; 
import 'underscore'; 

export function runMe() { 
    console.log($); // this print jquery object 
    console.log(_); // this print underscore object 
} 
+0

題外話:這裏的問題涉及其中'window'不可用,我這樣的情況下,jQuery的出口工廠,這是不符合'jquery.d.ts'相應的環境 –