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

时间:2018-08-23 01:36:23

标签: typescript

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

function zip2<A, B>(a: A[], b: B[]): Array<[A, B]>

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

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

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

1 个答案:

答案 0 :(得分:4)

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][]

(不得不嘲弄巴萨拉特。)