【发布时间】:2021-12-08 08:39:47
【问题描述】:
我正在尝试编写一个函数来合并,并将已排序的数组排序为一个排序数组。它接受对象数组的数组,以及一个要比较的键,这将是比较的基础。我需要确保提供的键的值始终是数字。
这是我目前的情况:
const sortMerge = <
A extends Array<I>,
K extends keyof A[number],
I = A[number] & {
[key in K]: number;
},
>(
arrays: A[],
key: K,
sortMethod = SortMethod.asc,
) => {
const indexesOfArrays = arrays.map(() => 0);
const mergedSorted = [];
while (arrays.some((array, i) => array.length > indexesOfArrays[i])) {
const currentItemsOfArrays = arrays.map(
(array, arrayIndex) => array[indexesOfArrays[arrayIndex]],
);
const comparison = currentItemsOfArrays.map((item) =>
item ? item[key] : (sortMethod === SortMethod.asc ? Infinity : -Infinity),
);
const nextArrayIndex = comparison.indexOf(
Math[sortMethod === SortMethod.asc ? 'min' : 'max'](...comparison),
);
const nextItem = currentItemsOfArrays[nextArrayIndex];
mergedSorted.push(nextItem);
indexesOfArrays[nextArrayIndex]++;
}
return mergedSorted;
};
一切都很好,但它不能将I[K] 识别为number,但这就是我试图将K 和I 定义为泛型的原因。
我做错了什么?
预期的错误/类型:
const missingKey = [ { a: 1 } ];
const valid = [ { a: 2, b: 3 } ];
const anotherValid = [ { c: 3, b: 4 } ];
sortMerge([missingKey, valid], 'b') // missingKey[number] is missing property 'b';
sortMerge([valid, anotherValid], 'b') // expected return type: ({ a: number, b: number } | { c: number, b: number })[]
【问题讨论】:
-
请提供有关通用约束的更多信息。你期望成为
A、K和I?
标签: arrays typescript types type-inference typescript-generics