如何在打字稿中输入定义 zip 函数

TTY*_*358 9 javascript typescript

假设我想创建一个zip函数:

function zip(arrays){
    // assume more than 1 array is given and all arrays 
    // share the same length
    const len = arrays[0].length;
    const toReturn = new Array(len);
    for (let i = 0; i < len; i++){
        toReturn[i] = arrays.map(array=>array[i]);
    }
    return toReturn;
}

console.log(zip([
    [1,2,3],
    [4,5,6],
    [7,8,9],
    [10,11,12],
]));
/*
Output:
(3) [Array(4), Array(4), Array(4)]
0: (4) [1, 4, 7, 10]
1: (4) [2, 5, 8, 11]
2: (4) [3, 6, 9, 12]
*/
Run Code Online (Sandbox Code Playgroud)

为了在所有数组都包含相同类型的元素时定义此函数:

    function zip<T>(arrays: T[][]): T[][]{/* codes omited here */}
Run Code Online (Sandbox Code Playgroud)

然而,当数组具有不同类型的元素时,我对如何使用泛型类型来完成类型定义感到困惑。

    const zipedResult = zip([[1,2,3],[true,false,true],['a','b','c']]);
    // error raises: Type 'false' is not assignable to type 'number'.(2322)
Run Code Online (Sandbox Code Playgroud)

我想要的是

    [[1,2,3],[true,false,true],['a','b','c']]
Run Code Online (Sandbox Code Playgroud)

可以自动推断为,(number|boolean|string)[][]无需编写as (number|boolean|string)[][] 或什至推断为,推断[number[],boolean[],string[]]结果为zip[number, boolean, string][]

我应该如何正确输入定义zip来完成这些功能?

Oli*_*ini 0

我认为做到这一点的唯一方法是zip为您想要处理的每个大小的数组定义一个不同的函数(因为我们需要能够准确说出zip 结果的每个部分中的内容):

const zip3 = <T, U, V>(arrays: [T[], U[], V[]]): [T, U, V][] => {
    const len = arrays[0].length;
    const toReturn: [T, U, V][] = new Array(len);
    for (let i = 0; i < len; i++){
        toReturn[i] = [arrays[0][i], arrays[1][i], arrays[2][i]];
    }
    return toReturn;
};

const result = zip3([
    [1,2,3],
    [true, false, true],
    [7,8,9],
]);

console.log(result);
Run Code Online (Sandbox Code Playgroud)

希望有人可以进来并展示一种更好的方法来做到这一点,而不必根据您想要压缩的数组数量重新定义函数;