首页 > 解决方案 > 键入调整函数

问题描述

我正在寻找一个函数,它接受一个索引、一个函数和一个数组,并返回一个数组的克隆,除了使用该函数调整指定索引处的项目。

const adjust = <T, U extends T[], V extends number>(index: V) =>
  (f: (x: U[V]) => U[V]) => (xs: T[]) =>
    Object.assign([], xs, { [index]: f(xs[index]) });

我希望这会返回类型U,但它返回类型:

never[] & T[] & {
    [x: number]: U[V];
}

关于如何让它返回更可用的类型有什么想法吗?

标签: typescript

解决方案


Simple way to do what you want:

function modifyItem<T>(array: T[], index: number, modifier: (item: T) => T): T[] {
  return array.map((item, i) => i === index ? modifier(item) : item);
}

Alternatively if you want to keep all the type information with tuples:

function modifyItem<T extends unknown[], U extends keyof T>(array: T, index: U, modifier: (item: T[U]) => T[U]): T {
  const result = [...array] as T;
  result[index] = modifier(result[index]);
  return result;
}

More functional style version with currying:

const modifyItem =
  <T extends unknown[]>(array: T) =>
  <U extends number>(index: U) =>
  (modifier: (item: T[U]) => T[U]) => [
    ...array.slice(0, index),
    modifier(array[index]),
    ...array.slice(index + 1)
  ] as T;

推荐阅读