如果用户通过类型[Iterable<T>],我想返回类型[T],如果用户通过类型[Iterable<T>, Iterable<U>],我想返回类型[T, U].我想对输入数组中任意数量的元素继续这个过程.

有没有一种方法可以通用地定义以下函数的类型,这样它就可以用于任意数量的输入,而不是随着泛型数的增加而继续定义函数的重载?

到目前为止,我已经做到了这一点,但它当然只支持定义的最多5个输入.我能让它适用于任意数量的输入吗?

export function linkIterables<T>(
  iterables: [Iterable<T>],
): Iterable<[T]>;
export function linkIterables<T, U>(
  iterables: [Iterable<T>, Iterable<U>],
): Iterable<[T, U]>;
export function linkIterables<T, U, V>(
  iterables: [Iterable<T>, Iterable<U>, Iterable<V>],
): Iterable<[T, U, V]>;
export function linkIterables<T, U, V, W>(
  iterables: [Iterable<T>, Iterable<U>, Iterable<V>, Iterable<W>],
): Iterable<[T, U, V, W]>;
export function linkIterables<T, U, V, W, X>(
  iterables: [Iterable<T>, Iterable<U>, Iterable<V>, Iterable<W>, Iterable<X>],
): Iterable<[T, U, V, W, X]>;
export function* linkIterables<T>(
  iterables: Iterable<Iterable<T>>,
): Iterable<T[]> {
  const iters = [...iterables].map(u => u[Symbol.iterator]());
  while (true) {
    let done = true;
    const results = [];
    for (const iter of iters) {
      const result = iter.next();
      if (!result.done) {
        done = false;
      }
      results.push(result.value);
    }
    if (done) {
      return results;
    }
    yield results;
  }
};

推荐答案

是的,您可以使用mapped types on array and tuple types来表示将输出元组类型T转换为输入元组类型的一般操作,其中T中的每个数字索引I将具有类型Iterable<T[I]>的属性.这样地:

export function linkIterables<T extends any[]>(
  iterables: [...{ [I in keyof T]: Iterable<T[I]> }]
): Iterable<T>;

请注意,在[... ]中包装iterables类型使用variadic tuple type语法来提示我们希望编译器尽可能将iterables解释为元组类型,而不仅仅是array.让我们试试:

const result = linkIterables([
  [1, 2],
  ["a", "b"],
  [true, false],
  [new Date(), new Date()],
  [document, document],
  [null, null]
]);

// const result: Iterable<[number, string, boolean, Date, Document, null]>

看起来不错!

Playground link to code

Typescript相关问答推荐

类型脚本中的Gnomeshell 扩展.如何导入.ts文件

使用前的组件渲染状态更新

`((PrevState:NULL)=>;NULL)|null`是什么意思?

对数组或REST参数中的多个函数的S参数进行类型判断

TypeScrip表示该类型不可赋值

我可以使用TypeScrip从字符串词典/记录中填充强类型的环境对象吗?

如何在处理数组时缩小几个派生类实例之间的类型范围?

类型TTextKey不能用于索引类型 ;TOption

如何在NX工作区项目.json中设置类似angular.json的两个项目构建配置?

函数重载中的不正确TS建议

如何以Angular 导入其他组件S配置文件

常量类型参数回退类型

如何在省略一个参数的情况下从函数类型中提取参数类型?

如何按属性或数字数组汇总对象数组

我怎样才能正确地输入这个函数,使它在没有提供正确的参数时出错

TS2739将接口类型变量赋值给具体变量

如何创建一个将嵌套类属性的点表示法生成为字符串文字的类型?

如何处理可能为空的变量...我知道这不是Null?

Vite+Chrome扩展 list v3-;不能在模块外使用import语句;对于inpage脚本

什么';是并类型A|B的点,其中B是A的子类?