2016-03-18 3 views
0

Я пытаюсь написать упрощенную поверхность API, которая объединяет кучу типов машинописных модулей (т. Е. let asdf = new Root.A.B.C()).Частичный экспорт машинописных модулей в пространстве имен

Я хотел бы разделить импорт на пространства имен. Я не уверен, поддерживает ли машинопись это, я надеюсь, что это так. Что-то похожее на это ...

import { C, default as D } from './ModuleA'; 
import * as B from './ModuleB'; 

export namespace A { 
    export { C, D }; 
}; 

export { B }; 

ModuleB это пространство имен, потому что я экспортирует все под псевдонимом как B, но я не могу сделать частичный экспорт ModuleA, потому что вы не можете exportinside пространства имен.

Надеюсь, я просто пропустил что-то очевидное и простое.

Спасибо.

+0

Незначительные: нетрадиционное иметь точку с запятой в 'имена Foo {}', как нетрадиционные в ', если() {};' 'или функциях() {};' 'или класс Foo {};'. Не наносит ли вреда, но даже любители с запятой (например, я) не пишут точку с запятой – basarat

+0

Я согласен, что это выглядит странно, но в случае экспорта АСТ фактически анализируется как утверждение (я предполагаю), которое по своей природе заканчивается полу. Мне немного любопытно, как tslint обрабатывает это ... – pjs

+0

Я (случайно) читал спецификацию грамматики и заметил, что не все экспортные выражения являются операторами, а экспорт пространства имен среди других определенно не анализирует полу. поэтому я соглашусь с тем, что полупрозрачный экспорт пространства имен, безусловно, нестандартен :) – pjs

ответ

0

Я надеюсь, что так и будет.

Он делает. Однако ваш export синтаксис в export {/*something*/} неверен. Это должно быть export something = somethingElse. Например.

import { C as importedC} from './ModuleA'; 
export namespace A { 
    export const C = importedC; 
} 
+0

Я только что пришел к тому же ответу несколько минут назад. Я боролся дальше о том, как экспортировать интерфейсы (и, в дополнение, к другим типам), но также понял это. Я отвечу на ваш ответ и добавлю свой дополнительный дополнительный ответ. Благодаря! – pjs

0

Просто добавить на принятый ответ, вот демо, как экспортировать общий интерфейс, типа класса, переменный класс (новый), способный экземпляр, а функция в суб- пространство имен из импортированного модуля. Обратите внимание, что мы выбираем индивидуальный экспорт из ModuleA для экспорта в наше пространство имен A.

import * as AExports from './ModuleA'; 

export namespace A { 
    export type IGenericInterface<T> = AExports.IGenericInterface<T>; 
    export type SomeClass = AExports.SomeClass; 
    export var SomeClass = AExports.SomeClass; 
    export const Instance = AExports.default; 
    export const someFunction = AExports.someFunction; 
} 

Вы можете реально сэкономить несколько нажатий клавиш, используя import alias, который будет экспортировать как тип и объявления переменных в одной строке.

import * as AExports from './ModuleA'; 

export namespace A { 
    export import IGenericInterface = AExports.IGenericInterface; 
    export import SomeClass = AExports.SomeClass; 
    export const Instance = AExports.default; 
    export const someFunction = AExports.someFunction; 
} 

При работе с дополнительным модулем импортные псевдонимы - единственный способ выполнить это.

import * as AExports from './ModuleA'; 
import * as B from 'ModuleB'; 

declare module 'ModuleB' { 
    namespace Things { 
    export namespace A { 
     export import SomeClass = AExports.SomeClass; 
    } 
    } 
} 
+0

Ваш экспорт для 'SomeClass' не позволит пользователям делать« новый SomeClass ». Взгляните на https://basarat.gitbooks.io/typescript/content/docs/project/declarationspaces.html для путей вокруг этого – basarat

+0

Спасибо за головы. Я уточню этот ответ с более полным ответом. – pjs

Смежные вопросы