从同一文件导出类和名称空间

时间:2018-10-01 09:51:01

标签: typescript typescript-typings

我有一个具有以下结构的代码:

export class Component {
  constructor(options: Component.Options) {}
}

export namespace Component {
  export interface Options {
    // some values here...
  }
}

然后按如下所示使用它:

import {Component} from './component'

const options: Component.Options = {};
new Component(options);

Options定义增长过多并且我们想将带有接口的命名空间提取到单独的文件中时,就会发生问题:

./ component / interfaces.ts

export namespace Component {
  export interface Options {
    // some values here...
  }
}

./ component / index.ts

export * from './interfaces';

export class Component {
  constructor(options: Component.Options) {}
}

发生这种分离时,代码无效,Typescript返回错误

 index.ts:3:16 - error TS2702: 'Component' only refers to a type, but is being used as a namespace here.

 const options: Component.Options = {};
                ~~~~~~~~~

是否可以在不更改导出名称的情况下对其进行修复?我们不能这样做,因为这些接口已经被客户使用,并且我们不能在次要版本中更改名称。

1 个答案:

答案 0 :(得分:0)

合并定义的唯一方法是在同一范围(全局,模块(包括所有扩充)或名称空间)中使用相同的名称定义它们,以给出单个符号。一旦有了两个不同的符号,就无法以任何方式合并它们,包括尝试以相同的名称导出它们。出于实现的原因,类具有附加的限制,即名称空间只有在稍后在同一文件中定义时才能与之合并。因此,您必须在index.ts中定义interfaces.ts命名空间,并从index.ts复制单个成员;不幸的是,无法使用通配符。例如,您可以编写import { Component as InterfacesComponent } from './interfaces'; export class Component { constructor(options: Component.Options) {} } export namespace Component { export import Options = InterfacesComponent.Options; }

interfaces.ts

或者您可以从{{1}}中省略命名空间层,并在发现混乱的情况下相应地更新导入。