如何避免模块导出变得笨拙

时间:2018-07-26 17:19:59

标签: typescript es6-modules code-organization

可以说我具有文件结构:

- products
-- index.ts
-- fooProduct.ts
-- barProduct.ts
-- wootProduct.ts

在每个“产品”文件中,都有获取产品sku和对象创建者以及可能特定于该产品的其他内容的方法。这是针对React项目的,因此我避免将类作为最佳实践状态(对于传统的OO人员而言,这是艰难的过渡)。

示例:

// products/fooProduct.ts
export interface FooProduct extends BaseProduct { //base defined in index
  //...
}

function getFooProductSku(){

}

function createFooProduct(){

}

function doFooStuff(){

}

在索引文件中,我正在导出所有内容

// products/index.ts
export * from './fooProduct';
export * from './fooProduct';
export * from './fooProduct';

我正在努力解决的问题是,这会导致我的从属文件中的FLAT导入非常混乱:

// dep-file.ts
import { FooProduct, createFooProduct, getFooProductSku, doFooStuff, 
         BarProduct, createBarProduct, getBarProductSku, 
         WootProduct, createWootProduct, getWootProductSku } from './products'

上面的内容看起来并不可怕,但是在实践中,如果域更加复杂,它将变得笨拙且难以阅读。我认为更大的问题是通过命名约定(例如EG Foo前缀)来查看哪些功能紧密耦合的唯一方法。

为解决此问题,我将方法嵌套在一个导出的对象中,因此,上面的类现在看起来像这样:

export interface FooProduct extends BaseProduct { //base defined in index
  //...
}

export const fooProduct = {
  getProductSku: () => {

  },

  createProduct: () => {

  },

  doStuff: () => {

  }
}

这使我可以从函数名称中删除Foo,现在无论添加了什么其他方法,相同的依赖导入看起来都像这样:

// dep-file.ts
import { FooProduct, fooProduct,
         BarProduct, barProduct,
         WootProduct, wootProduct } from './products'

我认为这可以更好地实现我的目标,但是我不相信这实际上是一种好习惯,还是想知道是否有更好的方法可以实现类似的目标?

1 个答案:

答案 0 :(得分:1)

// products/index.ts
import * as FooModule from './fooProduct';
import * as BarModule from './barProduct';
export { FooModule, BarModule };

// dep-file.ts
import { FooModule, BarModule } from './products';
type t = FooModule.FooProduct;
// Etc.  Change the names as desired.