代码之家  ›  专栏  ›  技术社区  ›  Geir Sagberg

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

  •  2
  • Geir Sagberg  · 技术社区  · 7 年前

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

    服务器位于。cshtml:

    <script>
      const RazorGlobals = {
        apiBaseUrl: '@Model.ApiBaseUrl'
      }
    </script>
    

    客户端代码:

    declare const RazorGlobals: {
      apiBaseUrl: string
    }
    
    fetch(RazorGlobals.apiBaseUrl + '/myResource').then(doStuff)
    

    现在我必须重复 declare const RazorGlobals... 在我需要使用它的每个文件的顶部。我正在寻找一种在单个位置定义此声明的方法,类似于以下伪代码:

    全局。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)
    

    有没有办法做到这一点?

    2 回复  |  直到 7 年前
        1
  •  5
  •   toskv    7 年前

    如果要声明全局变量的存在,而该全局变量在任何地方都可用,则只需具有一个。d、 ts文件,其中包含声明。

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

    不需要进口。

        2
  •  2
  •   gilamran    7 年前

    首先,不要假设全局变量, there are many reasons for that .

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

    例如

    配置。ts

    import { IAppConfig } from '../shared/AppConfig';
    export const APP_CONFIG: IAppConfig = (window as any).RazorGlobals;
    

    组成部分ts

    import { APP_CONFIG } from './config';
    console.log(APP_CONFIG.apiBaseUrl);
    

    至于共享类型,您应该有 shared 在本例中,客户端和服务器之间的文件夹以及所有类型都应该存在 AppConfig.d.ts

    使用相同的 tsconfig.json 问题很严重。我有一个 medium post 关于这一点,以及开源 starter-kit .