输入参数的高级键入数组

时间:2019-09-24 15:15:19

标签: typescript generics typescript-typings typescript-generics

当您要“分解”传入参数数组时,是否有办法摆脱方法重载?

例如,您有一个包含属性配置的类:

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,您可以看到它的工作原理。

0 个答案:

没有答案