是否可以在TypeScript中共享全局声明?

是否可以在TypeScript中共享全局声明?,typescript,Typescript,我通常会将一些服务器端变量放入全局范围,以便可以从客户端TypeScript代码中的任何位置访问它们,例如: .cshtml中的服务器: <script> const RazorGlobals = { apiBaseUrl: '@Model.ApiBaseUrl' } </script> 目前,我必须在需要使用它的每个文件的顶部重复declare const RazorGlobals…部分。我正在寻找一种在单个位置定义此声明的方法,类似于以下伪代码: g

我通常会将一些服务器端变量放入全局范围,以便可以从客户端TypeScript代码中的任何位置访问它们,例如:

.cshtml中的服务器:

<script>
  const RazorGlobals = {
    apiBaseUrl: '@Model.ApiBaseUrl'
  }
</script>
目前,我必须在需要使用它的每个文件的顶部重复
declare const RazorGlobals…
部分。我正在寻找一种在单个位置定义此声明的方法,类似于以下伪代码:

globals.d.ts:

export declare const RazorGlobals: {
  apiBaseUrl: string
}
文件1.ts:

import './globals'

fetch(RazorGlobals.apiBaseUrl + '/myResource').then(doStuff)
文件2.ts:

import './globals'

fetch(RazorGlobals.apiBaseUrl + '/myOtherResource').then(doOtherStuff)

有没有办法实现这样的目标?

首先,不要假设全局变量

您可以在客户端中有一个公开这些类型的模块,该模块应该接受全局变量并公开它

比如说

config.ts

import { IAppConfig } from '../shared/AppConfig';
export const APP_CONFIG: IAppConfig = (window as any).RazorGlobals;
import { APP_CONFIG } from './config';
console.log(APP_CONFIG.apiBaseUrl);
组件。ts

import { IAppConfig } from '../shared/AppConfig';
export const APP_CONFIG: IAppConfig = (window as any).RazorGlobals;
import { APP_CONFIG } from './config';
console.log(APP_CONFIG.apiBaseUrl);
至于共享类型,在客户端和服务器之间应该有一个
shared
文件夹,所有类型都应该在那里,在本例中为
AppConfig.d.ts


使用相同的
tsconfig.json
编译客户机和服务器是非常有问题的。我有一个关于这方面的文件,还有一个开源文件。

如果你想声明一个全局变量的存在,而这个全局变量在任何地方都可用,你所需要的就是有一个包含声明的.d.ts文件

//globals.d.ts
声明const RazorGlobals:{
apiBaseUrl:string
}

不需要导入。

将d.ts文件放在两个应用程序都可以访问的地方?是的,这意味着抱歉。更新了代码以澄清我的意图。他想为在全局上下文中定义的变量添加类型。您的解决方案只是在名为globals的模块中创建一个变量。他的解释是正确的,他只需要弄清楚如何让编译器包含他的文件和定义。如果globals d.ts文件与您的项目位于同一文件夹中。只需删除
export
和import语句。tsc应自动拾取。尽管如此,@gilamran确实有一个观点,你可能不应该只是假设它会存在,而是应该让它成为你的应用程序配置的一部分。这正好回答了我刚才提出的问题,所以我将它标记为答案。话虽如此,我可能会像@gilamran建议的那样做,这似乎是一种更安全的方法:)确实如此。:)