错误TS2304:找不到名称'ga'

时间:2018-03-02 11:37:36

标签: angular google-analytics

我正在使用Angular4并尝试安装分析。 我遵循了这个指南:

https://blog.thecodecampus.de/angular-2-include-google-analytics-event-tracking/

但是当我尝试构建我的项目时,我收到错误:

  

错误TS2304:找不到名称'ga'。

我已经检查了我的package.json,并且在 devDependencies 中安装了"@types/google.analytics": "0.0.38",。 当我开始输入时,我可以看到intellisense知道它是UniversalAnalytics.ga类型,但我无法让它工作。

我尝试将代码更改为:

this.router.events.subscribe(event => {
  if (event instanceof NavigationEnd) {
    let ga: Function;
    ga('set', 'page', event.urlAfterRedirects);
    ga('send', 'pageview');
  }
});

它编译,但在console.log中我得到一个错误说明:

  

未捕获(承诺):TypeError:ga不是函数

如果我改为:

this.router.events.subscribe(event => {
  if (event instanceof NavigationEnd) {
    let ga: any;
    ga('set', 'page', event.urlAfterRedirects);
    ga('send', 'pageview');
  }
});

我得到了同样的错误。 有谁知道为什么?

以下是完整的代码:

import { Component, OnInit, AfterViewChecked, AfterViewInit } from "@angular/core";
import { ActivatedRoute, Params, Router, NavigationEnd } from "@angular/router";

import { ResultsService } from "./shared/results.service";
import { HeightService } from "./shared/height.service";

@Component({
  selector: 'bzRoot',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss']
})
export class AppComponent implements OnInit, AfterViewChecked, AfterViewInit {
  constructor(
    private _activatedRoute: ActivatedRoute,
    private _resultsService: ResultsService,
    private _heightService: HeightService,
    public router: Router) {
  }

  ngOnInit() {
    this._activatedRoute.queryParams.subscribe((params: Params) => {
      // Only update the elq if it changes (remember: changing a parameter causes the page to refresh)
      var elq = params['elqid'];
      if (elq) {
        this._resultsService.elq = elq;
      }
    });
  }

  ngAfterViewChecked() {
    this._heightService.resize();
  }

  ngAfterViewInit() {
    //this.router.events.subscribe(event => {
    //  if (event instanceof NavigationEnd) {
    //    let ga: Function;
    //    ga('set', 'page', event.urlAfterRedirects);
    //    ga('send', 'pageview');
    //  }
    //});
  }
}

5 个答案:

答案 0 :(得分:3)

我找到了做声明的替代方法。我修改了我的代码:

this._router.events.subscribe(event => {
  if (event instanceof NavigationEnd) {
    (<any>window).ga('set', 'page', event.urlAfterRedirects);
    (<any>window).ga('send', 'pageview');
  }
});

它有效。 我在另一个指令中找到了这个方法。

答案 1 :(得分:2)

不知何故@ types / google.analytics包接缝被破坏了。只需将其添加到您的代码中:

             chart.addSeries({
                 type: 'column',
                 yAxis: 1,
                 data: cols,                     
                 zIndex: 9999,
                 minPointLength: 10,
                 threshold: -0.1,
                 pointPadding: 0,
                 pointRange: 0,
                 groupPadding: 0,
                 showInLegend: false,
                 tooltip: {
                     pointFormat: false
                 },
                 states: {
                     hover: {
                         enabled: false
                     }
                 }                 
             });
                 chart.addSeries({
                 name: "Study Days",
                 data: data,
                 maxPointWidth: 30,
                 point: {
                     events: {
                         click: function() {
                             if (url != "")
                                 window.open(url,'_blank');                                 
                         }
                     }
                 }
             });

我会更新我的博文。

答案 2 :(得分:0)

此外,您可以完全避免打字稿类型检查:

 window['ga']('set', 'page', event.urlAfterRedirects);
 window['ga']('send', 'pageview');

答案 3 :(得分:0)

您可以将google.analytics添加到tsconfig.json中的类型

"types": [
  "node",
  "google.analytics",
],

..或者您可以从配置中删除整个types属性,以使其全部使用@types。 在此处检查“类型”部分:https://www.typescriptlang.org/docs/handbook/tsconfig-json.html

答案 4 :(得分:0)

我最近遇到了这个问题,并且解决了为Google Analytics(分析)@types/google.analytics添加类型定义包的问题。

因此,如果您需要处理一些流行的api,这些api公开一些全局变量,例如(谷歌分析,lodash,jquery等。),请在npmjs上查找类型定义。如果找不到,则可以创建自己的declaration file