我用global.d.ts
定义全局变量:
// global.d.ts
declare const AAA: "aaa"
// main.ts
console.log(AAA) // 编译器不报错
但是在执行main.ts的时候
npx ts-node main.ts
报错:
...
nodede_modules/ts-node/src/index.ts:859
return new TSError(diagnosticText, diagnosticCodes, diagnostics);
^
TSError: ⨯ Unable to compile TypeScript:
main.ts:1:13 - error TS2304: Cannot find name 'AAA'.
1 console.log(AAA)
~~~
TypeScript 允许声明全局变量,用题主的方法可以,也可以用在 .d.ts
文件中声明
declare global {
const AAA: string;
}
然后直接可用。
不过声明是声明,这是给 TS 用的,实现仍然是 JS 实现。光有声明不代表一定有对应的 JS 的实现。如果是引入的第三方库,实现应该是会直接挂在 globalThis
或者 window
/global
这样的全局对象上的。如果是自己其他地方挂上去的也可以。
注意:JS 里全局变更可以直接访问,也可以通过 globalThis.
来访问,但是在 TS 里,声明的全局可以直接访问,但不能 globalThis.
来访问,除非在 globalThis 类型中声明它。
问题在于,自己写 TS 程序的时候,只要声明了,就可以使用全局变量,包含赋值(声明为 let
或者 var
时)。但是不管你写在哪个 .ts
文件中,这个文件都需要要在其他地方引用(调用)才会执行 —— 既然如此,何必非要写全局,直接写模块变量导出不好么,还更好控制。
对于这个问题,更常见的情况是在 TS 中声明,通过构建环境(比如 Webpack、Vite 等)注入。比如版本信息,就可以直接使用 package.json 中的版本号。以 Vue(Vite) 为例:
// vite.config.js
import { version } from "./package.json"
/...
export default {
define: {
__APP_VERSION: JSON.stringify(version)
}
}
记得在 TypeScript 类型文件中添加声明,以及在 eslint 配置中加 __APP_VERSION
全局变量声明
不可能的,正如楼上所说,没有这功能,不过你可以往globalThis里面加属性,也能访问到
TypeScript不鼓励写全局变量,鼓励用模块系统。因此TS没有,也不会有方便的写global的方式。
https://juejin.cn/post/7026629072004317192
https://juejin.cn/post/6898710177969602574
问题内容: 在Coffeescript.org上: 将编译为: 通过在node.js下的coffee-script进行编译可以做到: 文件说: 如果要创建供其他脚本使用的顶级变量,请将它们作为属性附加到窗口或CommonJS中的exports对象上。如果您同时针对CommonJS和浏览器,那么存在运算符(见下文)为您提供了一种可靠的方法来确定将它们添加到何处:root = exports?这个 然
我在typescript中声明了一个全局变量,类似于:global。test=“something”我尝试这样做,我得到错误属性“test”在类型“Global”上不存在。
我的文件中有这段代码,在这里我可以简单地使用。 现在,我需要使用socket从各种文件发出事件,而不想连接此
在JavaScript中,我可以这样做: 然后在另一个文件中: 它将定义
问题内容: 是否可以使用webpack定义全局变量以产生如下所示的结果: 我看到的所有示例都使用外部文件 问题答案: 有几种方法可以处理全局变量: 1)将变量放入模块中。 Webpack仅对模块进行一次评估,因此您的实例保持全局状态,并在模块之间进行更改。 因此,如果您创建像a之类的东西并导出所有全局变量的对象,则可以读取/写入这些全局变量。您可以导入一个模块,从功能中对对象进行更改,然后导入另一
问题内容: 是否可以在JavaScript函数中定义全局变量? 我想在其他函数中使用变量(在函数中声明)。 问题答案: 是的,正如其他人所说的,您可以在全局范围内(在所有函数之外)使用声明全局变量: 或者,您可以在上分配一个属性: …因为在浏览器中,用声明的 所有全局变量 都是对象的属性。(在最新规范ECMAScript 2015中,全局范围内的new ,和语句创建的不是全局对象属性的全局变量;这