现在可以使用 Typescript 3.0 的通用 rest 参数实现类型化的 zip 函数吗?

Nic*_*ick 4 typescript

您已经可以定义一个类型化的 zip 函数,它接受固定数量的参数,如下所示:

function zip2<A, B>(a: A[], b: B[]): Array<[A, B]>
Run Code Online (Sandbox Code Playgroud)

我想知道现在是否可以创建一个接受具有通用返回类型的 rest 参数的 zip 函数?

function zip(...args) {
    return args[0].map((_, c) => args.map(row => row[c]));
}
Run Code Online (Sandbox Code Playgroud)

据我所知,在 Typescript 3.0 中添加的新通用 rest 参数<T extends any[]>仍然不足以键入以前的函数?

Mat*_*hen 9

typescript@next(将作为 TypeScript 3.1 发布)带有映射的元组:

type Zip<T extends unknown[][]> = { [I in keyof T]: T[I] extends (infer U)[] ? U : never }[];
function zip<T extends unknown[][]>(...args: T): Zip<T> {
    return <Zip<T>><unknown>(args[0].map((_, c) => args.map(row => row[c])));
}

declare const y: number[], z: string[]; 
let yz = zip(y, z);  // [number, string][]
Run Code Online (Sandbox Code Playgroud)

(不得不取笑巴萨拉。)