通过 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 解决方案可能适合您的用例。
对参数进行硬编码。
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;
}
我知道,长得丑
-
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 是否是一种正常做法(也许有一些我不知道的缺点),但它在当前阶段对我有用.
我正在尝试创建一种方法,该方法可用作使用不同构造函数参数实例化不同 类 的通用解决方案。
这里是这个 "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 解决方案可能适合您的用例。
对参数进行硬编码。
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; }
我知道,长得丑
-
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 是否是一种正常做法(也许有一些我不知道的缺点),但它在当前阶段对我有用.