首页 > 解决方案 > 打字稿:将局部变量名称分配给导入的嵌套命名空间

问题描述

我在一个单独的文件中声明了一个 JAVA 库,以构建其中使用的各种类和命名空间,因此当我从其他使用 JAVA 库的文件中引用它时,将会有相关的注释和类型。(这是一个 NativeScript 插件顺便说一句,这就是我混合 JAVA 和 JS 的原因)。

javalib.ts

export declare namespace org {
  export namespace fizz {
    export namespace buzz {
      export namespace libA {
        export class libAClassA { }
        export class libAClassB { }
      }

      export namespace libB {
        export class libBClassA { }
        export class libBClassB { }
      }
    }
  }
}

它看起来很狂野,我可能可以将其缩短为 justexport declare namespace org.fizz.buzz { ... }但我现在将其排除在外。

在另一个将使用其中一些类(即,libAClassA 或 libBClassB)的文件中,我当然想导入这些命名空间以使类型和引用跟随。到目前为止,我已经能够让它像这样工作:

应用程序.ts

import * as pkg from './javalib';

let aliceClass = new pkg.org.fizz.buzz.libA.libAClassA();
let bobClass = new pkg.org.fizz.buzz.libA.libBClassB();

虽然这可行,但它并不理想,因为必须写出整个命名空间来引用此定义可能会变得非常麻烦,因为这会在开发时增加代码可见性。相反,我可以只做一条毯子declare var org: any并完成它,但为了更好地开发这个项目以及其他人,我想利用它并设置它。

有什么方法可以将此命名空间引用转换为本地 var,类似于在 JAVA 中您可以做的事情import org.fizz.buzz;并突然拥有对该命名空间内所有内容的引用和访问权限?

理想应用程序.ts

let libA = org.fizz.buzz.libA;
let libB = org.fizz.buzz.libB; 

let aliceClass = new libA.libAClassA();
let bobClass = new libB.libBClassB();

标签: javascripttypescriptnativescript

解决方案


可以像在Ideal-app.ts中那样做,但要确保它与 Webpack 和 Snapshot 构建兼容,请在函数调用中初始化它们。像这样的东西,

let libA, libB;

function initializePackages() {
   if (!libA) {
     libA = org.fizz.buzz.libA;
     libB = org.fizz.buzz.libB; 
   }
} 

// Call it before accessing the variables
initializePackages();
let aliceClass = new libA.libAClassA();
let bobClass = new libB.libBClassB();

推荐阅读