通过链接到具有不同参数量的构造函数来实例化类

时间:2015-12-30 21:09:50

标签: javascript typescript instantiation

我正在尝试创建一个方法,该方法可以用作使用不同构造函数参数实例化不同类的通用解决方案。

这是一个这个“可以想象”的方法的例子,我对它应该如何看待的想法:

module flashist
{
    export interface ISimpleClass<ObjectType>
    {
        new (): ObjectType;
    }

    export class Instantiator
    {
        public createInstance(Class: ISimpleClass<ClassType>, ...args): ClassType
        {
            // I understand, that this annotation is not possible
            var result: any = new Class.apply(args);
            return (result as ClassType);
        }
    }
}

问题出现在以下行:

var result: any = new Class.apply(args);

我想将未知参数传递给构造函数。我明白,这种语法是不可能的,我只想展示类似于我想要实现的东西。

所以,我的问题是:我们在TypeScript和/或JS中有这个问题的解决方案吗?

2 个答案:

答案 0 :(得分:1)

我不确定您要实现的目标,但我认为有两种非最佳解决方案可能适合您的使用案例。

  1. 对参数进行硬编码。

    public createInstance(Class: ISimpleClass<ClassType>, ...args): ClassType
    {
        var result:ClassType;
        if (args.length == 0)
            result = new ClassToCreate();
        if (args.length == 1)
            result = new ClassToCreate(args[0]);
        // ...
        if (args.length == 8)
            result = new ClassToCreate(args[0],args[1],args[2],args[3],args[4],args[5],args[6],args[7]);
        // ...
    
        return result;
    }
    

    我知道,看起来很难看。

  2. 使用Object.create

    public createInstance(Class: ISimpleClass<ClassType>, ...args): ClassType
    {
        var result:any = Object.create(ClassToCreate.prototype); // create an object
        ClassToCreate.apply(result, args); // call the constructor
    
        return result;
    }
    
  3. 就像我说的那样,它们都不是最佳的,但可能会有所帮助,直到您找到更好的解决方案来解决问题。也许只将一个data字典传递给每个构造函数?

答案 1 :(得分:0)

通过使用 eval 功能实现我需要的方式:

var evalString: string = "new Class(";
args.forEach(
    (value: any, index: number, array: any[]): void =>
    {
        if (index > 0)
        {
            evalString += ",";
        }
        evalString += "args[" + index + "]";
    }
);
evalString += ");";

var result: any = eval(evalString);

我不确定使用 eval 功能是否正常?(可能有一些我不知道的缺点),但它在我现阶段适用于我