【问题标题】:Factory pattern in Typescript and expose only Factory ClassTypescript 中的工厂模式,仅公开工厂类
【发布时间】:2016-09-14 15:44:15
【问题描述】:

我正在使用工厂模式在打字稿中开发一个节点模块,我只想公开工厂类和接口。

结构:

iexp.ts

export interface IExp { 
    methodX(); 
}

A.ts

class A implements IExp {
}

B.ts

class B implements IExp {
}

工厂.ts

export class ExpFactory {
    createInstance(type:string) : IExp{
      if(type=="A") return new A();
      else return new B();
    }
}

所有类和接口都在它们自己的源文件中。我不想公开 A 类和 B 类,所以我没有使用 export 但是我也不能在 ExpFactory 类中使​​用它们。在 Java 中,类可以具有包范围,但我如何在 typescript 中做同样的事情?

【问题讨论】:

  • 如果您想将这些类放在单独的文件中,则必须导出每个类。打字稿中没有与包访问修饰符等效的东西。您可以做的是将所有这些类导入单个模块,然后只导出您想要的内容,然后导入该模块并使用它

标签: java node.js typescript factory


【解决方案1】:

您可以使用来自ExpFactoryAB(如果它们在同一个文件中)。如果没有,那么你必须从模块中导出它们,要么全部要么全无(它只能是公共的)。

但是,这并不能让您从模块外部轻松访问它们。如果您正在捆绑您的库,则入口点必须再次导出类,否则它们将无法在您的模块之外访问。如果您不捆绑,用户将不得不找出相对路径并直接从中导入。

【讨论】:

  • 如何再次导出课程?我想将我的代码组织到子文件夹中。假设我将所有类文件放入 MyModule/Code/ 文件夹中。我还有一个 .ts 文件,我在其中导入和导出了工厂和接口。现在我用这个新的 ts 文件作为主文件打包我的节点模块。如何访问这些导出的工厂和接口?它仍然需要我编写代​​码文件夹的完整相对路径。
【解决方案2】:

(个人风格建议)在javascript中,工厂模式最好通过使用闭包和选项包来实现。

class Root {
  method1()
  method2()
}

class Child extends Root {
  method1() //...
}

通过类似的方式更好地实现

function Root( opts : Options ) {
   var method1 = opts.method1 || defaultMethod1()
   var method2 = opts.method2 || defaultMethod2()
   return { method1, method2 }
}

在 JavaScript 中使用 new 是完全没有必要的,即使不被认为是有害的。

【讨论】:

    猜你喜欢
    • 2016-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多