使用TypeScript将导入导出为命名空间

使用TypeScript将导入导出为命名空间,typescript,typescript2.0,suman,Typescript,Typescript2.0,Suman,我的问题和这个差不多: 假设我有这个: //exported imports export {ISumanOpts, IGlobalSumanObj} from 'suman-types/dts/global'; export {ITestCaseParam} from 'suman-types/dts/test-suite'; export {IHookParam} from 'suman-types/dts/test-suite'; export {IDescribeFn} from 's

我的问题和这个差不多:

假设我有这个:

//exported imports
export {ISumanOpts, IGlobalSumanObj} from 'suman-types/dts/global';
export {ITestCaseParam} from 'suman-types/dts/test-suite';
export {IHookParam} from 'suman-types/dts/test-suite';
export {IDescribeFn} from 'suman-types/dts/describe';
export {ItFn, ITestDataObj} from 'suman-types/dts/it';
export {IBeforeFn} from 'suman-types/dts/before';
export {IBeforeEachFn} from 'suman-types/dts/before-each';
export {IAfterFn} from 'suman-types/dts/after';
export {IAfterEachFn} from 'suman-types/dts/after-each';
export {DefineObjectContext as IDefObjCtx} from "./test-suite-helpers/define-options-classes";
export {DefineObjectTestCase as IDefObjTestCase} from "./test-suite-helpers/define-options-classes";
export {DefineObjectAllHook as IDefObjAllHook} from "./test-suite-helpers/define-options-classes";
export {DefineObjectEachHook as IDefObjEachHook} from "./test-suite-helpers/define-options-classes";


export namespace s {

  // ! I want to move all of the above exported items into a namespace here

}
有没有一种方法可以使用
名称空间
模块
将事物作为名称空间的一部分导出,而不是单独导出它们

我有一个越来越接近的问题:

因此,我尝试将它们更改为导入,然后将它们设置为常量,如下所示:


但正如您所看到的,我的一些声明是接口,而不是类,在这种情况下,我会收到错误消息“仅引用类型,但在此处用作值”。

创建一个文件名
s.ts
,例如,您希望导出命名空间的所有内容:

export {ISumanOpts, IGlobalSumanObj} from 'suman-types/dts/global';
export {ITestCaseParam} from 'suman-types/dts/test-suite';
export {IHookParam} from 'suman-types/dts/test-suite';
export {IDescribeFn} from 'suman-types/dts/describe';
export {ItFn, ITestDataObj} from 'suman-types/dts/it';
export {IBeforeFn} from 'suman-types/dts/before';
export {IBeforeEachFn} from 'suman-types/dts/before-each';
export {IAfterFn} from 'suman-types/dts/after';
export {IAfterEachFn} from 'suman-types/dts/after-each';
export {DefineObjectContext as IDefObjCtx} from "./test-suite-helpers/define-options-classes";
export {DefineObjectTestCase as IDefObjTestCase} from "./test-suite-helpers/define-options-classes";
export {DefineObjectAllHook as IDefObjAllHook} from "./test-suite-helpers/define-options-classes";
export {DefineObjectEachHook as IDefObjEachHook} from "./test-suite-helpers/define-options-classes";
然后在您的模块中,您只需执行以下操作:

import * as s from './s'

export {s}
它将导出名为
s
的命名空间中的类型和值。然后,您可以使用以下方法导入它们:

import {s} from 'your-module'

const anObject: s.ISumanOpts = {...}
我所做的是:

import * as Block from './block'
import * as FullNode from './full-node'
import * as ListOnChain from './list-on-chain'
import * as HashTools from './hash-tools'
import * as KeyValueStorage from './key-value-storage'
import * as SequenceStorage from './sequence-storage'
import * as SmartContract from './smart-contract'
import * as NodeBrowser from './node-browser'
import * as NetworkApi from './network-api'
import * as NetworkClientBrowserImpl from './network-client-browser-impl'
import * as NodeApi from './node-api'
import * as NodeImpl from './node-impl'
import * as NodeTransfer from './node-transfer'
import * as NodeNetworkClient from './node-network-client'
import * as WebsocketConnector from './websocket-connector'

export {
    Block,
    FullNode,
    ListOnChain,
    HashTools,
    KeyValueStorage,
    SequenceStorage,
    SmartContract,
    NodeBrowser,
    NetworkApi,
    NetworkClientBrowserImpl,
    NodeApi,
    NodeImpl,
    NodeTransfer,
    NodeNetworkClient,
    WebsocketConnector
}
然后在另一个文件中,我可以这样导入,所有文件都将保留在自己的空间中:

import * as AllComponents from 'blockchain-js-core'
如果要逐个导入,可以执行以下操作:

import {
    Block,
    FullNode,
    ListOnChain,
    HashTools,
    KeyValueStorage,
    SequenceStorage,
    SmartContract,
    NodeBrowser,
    NetworkApi,
    NetworkClientBrowserImpl,
    NodeApi,
    NodeImpl,
    NodeTransfer,
    NodeNetworkClient,
    WebsocketConnector
} from 'blockchain-js-core'

这里可以找到一个例子:

您尝试的做法被认为不是最佳做法。如果没有显式的名称空间,调用方/客户端可以很容易地添加一个特殊的命名,方法是执行以下操作:
import*as-Suman from'.'.
。我希望使用这种语法-
import-Suman,{s}from'Suman'
,其中
s
将包含用户要查找的所有类型。它将允许自动建议等。使用@realharry的建议,您所需要的唯一区别是所有内容(包括
suman
)都可以在一个别名下使用<代码>导入*作为来自“…”的Suman您会发现
Suman.Suman
Suman.DefineObjectContext
。。。它还允许下游代码依赖更少的
import{suman,DefineObjectContext}from'.'.
suman
是一个太长的变量名,我想要一个简短的变量名作为类型。在心理上将代码与类型分开也很好,
suman
有运行时代码,
s
只有打字功能。这似乎是我目前唯一的选择-我认为这是TypeScript中的语法缺陷,但这一功能解决了所有问题,所以这是唯一可行的方法,谢谢<代码>导入/
导出
是ECMAScript。我不确定,但我认为这样做是为了更容易在浏览器上解析符号。即使编译了TypeScript,它仍然是ECMAScript的超集:/所有这些方法都有缺陷。它们基本上是“假”名称空间,如果不向代码中添加额外的解释性注释,则不清楚代码所做的是组装名称空间。我们寻求的是一种使用
namespace
关键字来实际定义这个集合名称空间的方法。名称空间没有内在的“自有”名称,并且必须在本地指定的名称下导入,这种想法完全是愚蠢的。