在导出的工厂函数/闭包内声明类

时间:2017-09-22 19:32:57

标签: typescript typescript2.0

说我有以下TypeScript代码:

export const makeMyClass = function(a: string, b: boolean){

   const MyClass = function(){

   };

   MyClass.prototype.foo = function(){};

   MyClass.prototype.bar = function(){};

   return MyClass;

}

我无法弄清楚如何将导出的工厂函数中的代码转换为TypeScript。

例如,如果我这样做:

 export const makeMyClass = function(a: string, b: boolean): MyClass {

       class MyClass {

       }

      // ...

      return MyClass;


  }

TypeScript抱怨说它无法找到姓名' MyClass'。请假设我需要使用导出的闭包makeMyClass来解决问题。

1 个答案:

答案 0 :(得分:1)

如果要为函数外部可见的makeMyClass()返回值的类型指定名称,则必须将其结构描述为外部作用域中的一种接口。至少我理解TypeScript implementationclass expressions

以下是我将如何处理您的情况。类具有实例类型(描述实例属性和类方法)和构造函数类型(描述构造函数和任何静态方法),因此我们需要描述两者:

export interface MyClassInstance {
  foo(): void;
  bar(): void; 
  // define the rest of the public interface here
}
export interface MyClassConstructor {
  new(): MyClassInstance;
  readonly prototype: MyClassInstance;
  // define any static methods here
}

现在您可以声明makeMyClass()返回构造函数类型:

export const makeMyClass = function(a: string, b: boolean): MyClassConstructor {

  // implement the MyClassInstance/MyClassConstructor interfaces
  class MyClass {
    foo() {
      // ...
    }
    bar() {
      // ...
    }
  }

  return MyClass;
}

请注意,这是重复的,因为您在函数内部和外部声明了类结构。如果向接口添加属性或方法,则需要向类实现添加相应的属性。遗憾的是,这似乎是不可避免的,因为你无法从内部函数中导出类型。

无论如何,希望有所帮助;祝你好运!