在TypeScript模块中使用jQuery扩展AngularJS

时间:2018-01-04 08:49:21

标签: javascript jquery angularjs typescript

在尝试使用我的代码库实现TypeScript时,我遇到了这个问题。似乎我用来按顺序加载jQuery和AngularJS的方式,AngularJS会接受jQuery的存在并通过其功能扩展自身。但是,在模块中本地导入时,AngularJS会被隔离加载,并且似乎无法使用jQuery扩展自身。因此,当我做这样的事情时:

import * as $ from 'jquery';
import * as angular from 'angular';

export default ['$window', function($window) {
  let position = angular.element($window).scrollTop();
}];

我收到此TypeScript错误:

  

属性' scrollTop'在' JQLite'。

类型中不存在

如何以一种它知道可以使用jQuery的方式加载AngularJS并随之扩展它?

2 个答案:

答案 0 :(得分:0)

如果您使用的是webpack,那么我们可以使用expose-loader库将jQuery加载到窗口对象。

webpack v1用法

module: {
  loaders: [
    { test: require.resolve("jquery"), loader: "expose-loader?$!expose-loader?jQuery" },
  ]
}

webpack v2用法

module: {
  rules: [{
          test: require.resolve('jquery'),
          use: [{
              loader: 'expose-loader',
              options: 'jQuery'
          },{
              loader: 'expose-loader',
              options: '$'
          }]
      }]
}

了解更多详情goto expose-loader

答案 1 :(得分:0)

基于@ParthRaval共享的链接,我能够通过将JQLite基类型转换为'any'类型来解决问题。事实上它确实是一个类型转换问题,而不是AngularJS没有完全加载和使用jQuery。将它包装在一个函数中会使它不那么难看。

import * as $ from 'jquery';
import * as angular from 'angular';

export default ['$window', function($window) {

  let position = JQLiteFix(angular.element($window)).scrollTop();

  function JQLiteFix(query) {
    return <any>query;
  }

}];