说我有以下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
来解决问题。
答案 0 :(得分:1)
如果要为函数外部可见的makeMyClass()
返回值的类型指定名称,则必须将其结构描述为外部作用域中的一种接口。至少我理解TypeScript implementation的class 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;
}
请注意,这是重复的,因为您在函数内部和外部声明了类结构。如果向接口添加属性或方法,则需要向类实现添加相应的属性。遗憾的是,这似乎是不可避免的,因为你无法从内部函数中导出类型。
无论如何,希望有所帮助;祝你好运!