【发布时间】:2020-09-18 19:45:23
【问题描述】:
假设我要创建一个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]
*/
为了在所有数组包含相同类型的元素时定义这个函数:
function zip<T>(arrays: T[][]): T[][]{/* codes omited here */}
但是,当数组具有不同类型的元素时,我对如何使用泛型类型来完成类型定义感到困惑。
const zipedResult = zip([[1,2,3],[true,false,true],['a','b','c']]);
// error raises: Type 'false' is not assignable to type 'number'.(2322)
我想要的是
[[1,2,3],[true,false,true],['a','b','c']]
可以自动推断为(number|boolean|string)[][] 而无需写入as (number|boolean|string)[][]
甚至
推断为[number[],boolean[],string[]] 和zip 的结果推断为[number, boolean, string][]
我应该如何正确键入define zip 来完成这些功能?
【问题讨论】:
-
iter-ops 具有 zip 运算符,无论同步还是异步都运行良好。而且,您可以检查其 TypeScript 声明 in the source ;)
标签: javascript typescript