问题前提
在使用mqtt的时候,由于mqtt是node的包,直接使用会报找不到global的错,在浏览器中无法使用mqtt的包,需要编译成浏览器支持的js文件并在index.html中引入,所以是直接使用mqtt的外部CDN在index.html中导入,这样就会在window注册一个全局变量mqtt。直接使用mqtt是没有问题的,但是由于mqtt是外部导入的变量,ts会报找不到这个变量的错误。
之前用declare module可以解决,但是好像是被解析成了命名空间,并且里面有什么方法,有什么类都是需要你自己重新定义的。如果你需要从mqtt的npm包取出一些类型来修饰返回值,那么mqtt就会重新指回变量,并且继续报错。
如果不从mqtt的包中导入类型,变成any类型,又得不到好的代码提示,那这样的话,还不如使用@ts-ignore直接注释解决找不到mqtt报错的问题。
有什么好的办法可以全局声明变量,并且可以拿到包中的类型吗?
说得简单一点就是,你在index.html中引入了axios的CDN,然后你写代码的时候就可以直接使用axios这个变量,但是你又想得到axios的AxiosStatic类型,此时你又不得不把axios安装到Dev开发依赖中,并且从axios中导出AxiosStatic这个类型,这样虽然也下载了axios,但是打包的时候不会被打包进去。(有的人可能会说,你都下载了axios的npm包了,为什么不直接使用npm包呢?还绕来绕去,大不了使用按需导入减小体积就行了?因为开头就说了,不能直接使用npm包,会报错的。要使用编译好的js文件,或者CDN才行。)
解决方案
方法一:直接定义declare global
要顶层export {}, 这样就可以直接使用了
方法二:使用declare const
这个就稍微麻烦了一点,使用declare const 来声明一个全局变量,并且在需要使用到这个变量的地方导入。用declare声明的变量不是真正意义上的声明变量,仅仅是起到一个类型提示的作用,或者是指向window的那个变量?(如有错误,还请指正。)