通过 link 实例化 类 给具有不同数量参数的构造函数

Instantiate classes by link to the constructors with different amount of parameters

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

这里是这个 "imaginable" 方法的一个例子,我对它应该是什么样子的看法:

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 and/or JS 中的这个问题,我们有什么解决方案吗?

我不确定您想要实现什么,但我认为有两种 non-optimal 解决方案可能适合您的用例。

  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;
    }
    

就像我说的,其中 none 个是最优的,但在您找到更好的问题解决方案之前可能会有所帮助。也许只向每个构造函数传递一个 data 字典?

我已经通过使用函数 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 是否是一种正常做法(也许有一些我不知道的缺点),但它在当前阶段对我有用.