typescript - 键入调整函数
问题描述
我正在寻找一个函数,它接受一个索引、一个函数和一个数组,并返回一个数组的克隆,除了使用该函数调整指定索引处的项目。
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];
}
关于如何让它返回更可用的类型有什么想法吗?
解决方案
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;
推荐阅读
- javafx - 在 Java FX Scene Builder 中添加自定义控件
- java - 动态 Json 响应映射到 Pojo
- docker - 基于 Openshift 的 Docker 多阶段构建
- jenkins - 当pytest作业测试失败时如何使管道阶段网格显示为不稳定
- azure - 当我的 Web 应用停止时,Azure 运行状况服务始终可用
- python-3.x - AttributeError:模块“PyQt5”没有属性“__version__”
- spring-boot - 如何使用 WebClient Spring 下载大文件?
- javascript - 在 IOS (Iphone/Ipad) 移动浏览器上自动下载存储在 S3 中的图像
- javascript - Cloudflare 工作人员 CORS 被忽略
- javascript - 如何在纯 HTML 和 JS 上使用/不使用 Amplify 实现 Cognito?