谷歌分析4与 typescript

unguejic  于 2023-02-20  发布在  TypeScript
关注(0)|答案(1)|浏览(146)

我想创建一个函数,仅当访问者同意时才触发GA4测量。我创建了如下函数:

document.querySelector('.cookie').addEventListener('click', function(){

        var ga = document.createElement('script')
        ga.type = 'text/javascript'
        ga.async = true
        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.googletagmanager.com/gtag/js?id=UA-XXXXXX-X'
        var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);

        let gat = window.dataLayer = window.dataLayer || [];
        function gtag(){dataLayer.push(arguments);}
                gtag('js', new Date());
                gtag('config', 'UA-XXXXXX-X');
                setCookie('cookie','1',365);
        return false;
    })

问题是打印脚本报告错误:一个一个。
我尝试了各种教程,安装了@types/gtag.js,但是错误仍然存在。你能告诉我哪里做错了吗?谢谢

0lvr5msh

0lvr5msh1#

这些 typescript 定义应起作用:

interface Window {
        dataLayer:any;
        }
       
        let dataLayer = window.dataLayer || [];
        function gtag(a:string, b:string|object){dataLayer.push(arguments);}
                gtag('js', new Date());
                gtag('config', 'UA-XXXXXX-X');

第一个类型定义用属性“dataLayer”扩展了现有的窗口接口。(这里的窗口带有大写字母W)。简单地说,您需要解释window对象具有属性dataLayer的Typescript。
如果代码片段位于一个模块中,那么这个定义可能有助于在其他模块中使用它:

declare global {
  interface Window {
    dataLayer:any;
  }
}

这里的第二个问题是函数gtag()看起来好像没有参数,但实际上,参数是用变量arguments捕获的。因此,我们需要定义参数类型。
如果你需要向GA发送不同数量的参数,你也可以使用这个宽泛的类型定义,它可以排除任意数量的参数(甚至是零个参数):

function gtag(...args: any[]):void {window.dataLayer.push(arguments);}

相关问题