Javascript 在TypeScript中动态返回类构造函数

Javascript 在TypeScript中动态返回类构造函数,javascript,typescript,factory,Javascript,Typescript,Factory,我试图在TypeScript中构建一种机制,根据表示类名称的字符串参数返回类的新实例。基本上,我正在尝试创建一个工厂,只是我不太明白如何在TypeScript中实现这一点。在纯JS中,我可以通过将所有类构造函数存储在一个键/值对象中并调用newclassdictionary[className]()来解决这个问题-这不是最健壮的解决方案,但它在这种情况下有效。我似乎无法在TypeScript中获得正确的类型和类型转换组合来完成这一任务。有更好的办法吗?我在TypeScript中找不到任何工厂模式

我试图在TypeScript中构建一种机制,根据表示类名称的字符串参数返回类的新实例。基本上,我正在尝试创建一个工厂,只是我不太明白如何在TypeScript中实现这一点。在纯JS中,我可以通过将所有类构造函数存储在一个键/值对象中并调用
newclassdictionary[className]()来解决这个问题-这不是最健壮的解决方案,但它在这种情况下有效。我似乎无法在TypeScript中获得正确的类型和类型转换组合来完成这一任务。有更好的办法吗?我在TypeScript中找不到任何工厂模式的示例,所以现在我只得到了一个bit switch语句,它既丑陋又不灵活。

让我们假设您有一个类定义:

module UI
{
    export class MyClass
    {
        constructor( data: any )
        {}
     }
}
您可以使用这种构造:

public static CreateController(  data: IControllerData ): any
    {
        return new data.namespace[data.controller]( data.initializationData );
    }
其中数据是JS对象,如下所示:

var data = {
            namespace: UI,
            controller: "MyClass"// <- this is the class name
            initializationData: {} // this is the parameters that you want to pass in constructor
}
var数据={
名称空间:UI,

控制器:“MyClass”/您可以为字典中的每个类添加函数声明,如下所示(访问:):

在操场工作()

或者以另一种方式

// ...
var ClassDictionary = { };

ClassDictionary["Date"] = Date;
function factory(className: "Date"): Date;

ClassDictionary["Number"] = Number;
function factory(className: "Number"): Number;

ClassDictionary["MyClass"] = MyClass;
function factory(className: "MyClass"): MyClass;

function factory(className: string) { 
    return new ClassDictionary[className]();
}
// ...
或与论点:

class MyClass {
    constructor(public myReturn: string) { }
    myMethod() { return this.myReturn; }
}

var ClassDictionary = { };

ClassDictionary["Date"] = Date;
function factory(className: "Date"): Date;

ClassDictionary["Number"] = Number;
function factory(className: "Number", value?: number): Number;

ClassDictionary["MyClass"] = MyClass;
function factory(className: "MyClass", myReturn: string): MyClass;

function factory(className: string, valueOrMyReturn?: number | string) { 
   if(valueOrMyReturn) return new ClassDictionary[className](valueOrMyReturn);
    return new ClassDictionary[className]();
}

var d = factory("Date");

/* Its a date. */
alert(d.toISOString());

var n = factory("Number", 42);

/* Now a number. */
alert(n.toPrecision());

var c = factory("MyClass", "This is the answer!");

/* And now MyClass. */
alert(c.myMethod());

听起来像是一个构建器模式。这满足了我的需要。我创建了一个带有类引用静态字典的简单工厂类。因为我所有的类都继承自同一个基,所以我只需要一个函数签名。简单有效,谢谢你的想法!
class MyClass {
    constructor(public myReturn: string) { }
    myMethod() { return this.myReturn; }
}

var ClassDictionary = { };

ClassDictionary["Date"] = Date;
function factory(className: "Date"): Date;

ClassDictionary["Number"] = Number;
function factory(className: "Number", value?: number): Number;

ClassDictionary["MyClass"] = MyClass;
function factory(className: "MyClass", myReturn: string): MyClass;

function factory(className: string, valueOrMyReturn?: number | string) { 
   if(valueOrMyReturn) return new ClassDictionary[className](valueOrMyReturn);
    return new ClassDictionary[className]();
}

var d = factory("Date");

/* Its a date. */
alert(d.toISOString());

var n = factory("Number", 42);

/* Now a number. */
alert(n.toPrecision());

var c = factory("MyClass", "This is the answer!");

/* And now MyClass. */
alert(c.myMethod());