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

问题描述 投票:0回答:1

您已经可以定义接受固定数量参数的类型化 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[]>
仍然不足以输入以前的函数?

typescript
1个回答
10
投票

在带有映射元组的 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][]
© www.soinside.com 2019 - 2024. All rights reserved.