当您要“分解”传入参数数组时,是否有办法摆脱方法重载?
例如,您有一个包含属性配置的类:
class PropertyConstructor<T> {
type: T;
}
class PropertyConfiguration<T, S extends keyof any> {
constructor(
public propertyKey: S,
public propertyConstructor: new () => PropertyConstructor<T>,
) {}
}
接下来,创建几个构造函数的继承者:
class StringPropertyConstructor extends PropertyConstructor<string> {
}
class NumberPropertyConstructor extends PropertyConstructor<number> {
}
接下来,创建函数,该函数将使用属性配置来构建类:
type Join<T, S extends keyof any> = {[P in S]: T};
function CreateClass<T1, S1 extends keyof any>(p1: PropertyConfiguration<T1, S1>): new () => Join<T1, S1>;
function CreateClass<T1, S1 extends keyof any, T2, S2 extends keyof any>(
p1: PropertyConfiguration<T1, S1>,
p2: PropertyConfiguration<T2, S2>,
): new () => Join<T1, S1> & Join<T2, S2>;
// ... And so on. It's very uncomfortable and ugly.
function CreateClass(...properties: Array<PropertyConfiguration<any, keyof any>>): new () => any {
class NewClass {}
// Here was the logic of executing property constructors
return NewClass;
}
并创建一些PropertyConfiguration实例:
const property1 = new PropertyConfiguration('property1', StringPropertyConstructor);
const property2 = new PropertyConfiguration('property2', NumberPropertyConstructor);
有趣的是,让我们尝试应用它:
class A extends CreateClass(property1, property2) {
}
const a = new A();
a.property1 // string;
a.property2 // number;
有效!但是,非常不舒服和丑陋。例如,如果要创建具有十个属性的类,则需要实现相应的重载。
有没有一种解决方案可以让您控制属性数组中的键入?
...
目前尚不清楚为什么需要这样做,但这只是因为我没有附加所有代码,而只留下了必要的部分。
Here,您可以看到它的工作原理。