Angular/TypeScript中declare global扩展Window添加analytics代码含义问询
问题1解答
你的认知完全正确。
这段是TypeScript的全局类型扩充代码,作用就是给TS内置的Window接口新增analytics属性,类型标注为any。经过这段声明后,TS类型系统会认可window.analytics是合法属性,你在调用时不会抛出「Window类型上不存在analytics属性」的错误,也不需要每次调用都加as any这类强行类型断言。
问题2解答
是否需要用declare global包裹声明,取决于你当前文件的类型:
- 如果你当前的代码文件是没有任何
import/export的纯脚本文件,本身默认处于全局作用域,直接写declare var analytics: any就可以正常生效,不需要用declare global包裹。 - 如果你当前的代码文件是ES模块(只要文件内出现
import或者export语句就属于模块),模块的作用域是封闭的,直接在模块内写declare var只会声明当前模块内部的局部变量,不会作用到全局作用域。这种场景下就必须用declare global包裹声明,显式告知TS「这个块内的所有类型定义都要注册到全局作用域,不是模块本地的」。
另外补充说明:你给出的代码选择扩充Window接口,是因为analytics是挂载在window对象上的属性,平时调用走的是window.analytics的形式。如果你希望analytics可以不携带window前缀、直接作为全局变量调用,也可以在declare global块内写declare var analytics: any,配置完成后你直接在全局任意位置写analytics.xxx,TS也不会报错。
内容的提问来源于stack exchange,提问作者YulePale
相关产品推荐
相关产品推荐

