如何从打字稿中的类数组中解包类型

时间:2018-10-28 16:09:39

标签: typescript

我有一个函数,该函数接收数组或Typescript类的其余部分,并将解析并返回其实例。

但是,我无法正确键入它。

如果我提取一个:

class Base {
  isBase = true;
}
class Foo extends Base {
  isFoo = true;
}
class Bar extends Base {
  isBar = true;
}

export interface BaseType<Se extends Base = Base> {
  new (...args: any[]): Se;
}

function unwrap<T extends Base>(baseType: BaseType<T>): T {
  return new baseType();
}

unwrap(Foo).isFoo;

它可以工作并且正确键入,返回正确的类型。但是,如果我有它们的数组,那是行不通的:

function unwrapAll<T extends Base>(...baseType: BaseType<T>[]): T[] {
  return baseType.map(b => new b());
}

const [foo, bar] = unwrapAll(Foo, Bar);
console.log(foo.isFoo, bar.isBar);

我知道Typescript有一些关于this的消息,但是我仍然找不到解决方法!

我找到了一种通过使用重载来管理它的方法,但是它的作用有限

function unwrapAll<T0 extends Base>(bT0: BaseType<T0>): [T0];
function unwrapAll<T0 extends Base, T1 extends Base>(bT0: BaseType<T0>, bT1: BaseType<T1>): [T0, T1];
function unwrapAll<T0 extends Base, T1 extends Base, T2 extends Base>(
  bT0: BaseType<T0>,
  bT1: BaseType<T1>,
  bT2: BaseType<T2>
): [T0, T1, T2];
function unwrapAll<T0 extends Base, T1 extends Base, T2 extends Base, T3 extends Base>(
  bT0: BaseType<T0>,
  bT1: BaseType<T1>,
  bT2: BaseType<T2>,
  bT3: BaseType<T3>
): [T0, T1, T2, T3];
function unwrapAll<T extends Base>(...baseType: BaseType<T>[]): T[] {
  return baseType.map(b => new b());
}

1 个答案:

答案 0 :(得分:2)

最近在3.1中可以使用mapped tuples

class Base {
  isBase = true;
}
class Foo extends Base {
  isFoo = true;
}
class Bar extends Base {
  isBar = true;
}

export interface BaseType<Se extends Base = Base> {
  new (...args: any[]): Se;
}


type UnwrapAll<T extends Array<BaseType<Base>>> ={ [P in keyof T]: T[P] extends BaseType<infer U> ? U : never}
function unwrapAll<T extends Array<BaseType<Base>>>(...baseType: T): UnwrapAll<T> {
  return baseType.map(b => new b()) as any;
}

const [foo, bar] = unwrapAll(Foo, Bar);
console.log(foo.isFoo, bar.isBar);