如果用户通过类型[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;
}
};