Typescript: назначение имени локальной переменной для импортированного вложенного пространства имен - PullRequest
0 голосов
/ 18 декабря 2018

Я объявляю библиотеку 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 и покончить с ним, но в попытке улучшить моего будущего разработчика в этом проекте, а также других, я хотел бы использовать это и настроить это.

Есть ли способ преобразовать эту ссылку на пространство имен в локальную переменную, подобно тому, как в JAVA вы можете просто сделать import org.fizz.buzz; и внезапно получить ссылки и доступ ко всему в этом пространстве имен?

ideal-app.ts

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

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

1 Ответ

0 голосов
/ 18 декабря 2018

Можно сделать так, как вы делаете в 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...