打字稿:将本地变量名称分配给导入的嵌套名称空间

时间:2018-12-18 06:07:19

标签: javascript typescript nativescript

我要在一个单独的文件中声明一个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 { }
      }
    }
  }
}

它看起来很疯狂,我可以将其缩短为export declare namespace org.fizz.buzz { ... },但现在暂时不介绍它。

在另一个将利用其中某些类的文件中(例如,libAClassA或libBClassB),我当然想导入这些名称空间,以进行键入和引用。到目前为止,我已经能够像这样:

app.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;并突然拥有对该名称空间中所有内容的引用和访问权限的方式?

理想应用程序

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

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

1 个答案:

答案 0 :(得分:0)

可以像在 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();