NodeJS中TypeScript声明全局变量为何需两次声明,有什么更优方案?
两次声明的原因
declare global块的作用是给全局顶层作用域补充类型,你使用let在此处声明LOG时,仅能让你直接调用LOG时通过类型校验,该声明不会同步到globalThis对象的属性类型中declare namespace globalThis是单独给globalThis全局宿主对象的属性补充类型,你调用globalThis.LOG时需要靠这个声明通过类型校验,所以在你用let声明的场景下,必须写两次才能覆盖两种调用方式的类型检查
更简洁的实现方式
TypeScript 3.4及以上版本只需要一次声明即可,将let替换为var写在declare global块里,就能同时覆盖顶层全局作用域和globalThis对象的类型识别,不需要重复声明,也不需要额外加eslint忽略规则:
declare global { // 注意此处必须用 var,let/const 的声明不会同步到 globalThis 的类型定义中 var LOG: Logger; } globalThis.LOG = new Logger();
补充说明
如果你的代码文件是没有import/export的脚本文件(本身运行在全局作用域下),可以直接省略declare global块,仅写declare var LOG: Logger;即可生效。
内容的提问来源于stack exchange,提问作者user3612643
相关产品推荐
相关产品推荐

