You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript中能否使用映射元组类型实现juxt函数类型定义?

问题原因

你的类型定义报错是因为keyof Fs会包含数组/元组的所有原型属性(比如length、map等),这些属性不属于函数类型,不满足ReturnType的入参约束。同时TS原生的Array.map方法无法直接推断出元组结构的返回值,需要额外做类型断言。

实现方案

可以通过条件类型过滤非函数类型的返回值,再对map的结果做类型断言,就能实现符合要求的类型定义:

type JuxtFn<T> = (x: T) => unknown
function juxt<T, Fs extends readonly JuxtFn<T>[]>(
  x: T,
  fns: Fs
): { [K in keyof Fs]: Fs[K] extends (x: T) => infer R ? R : never } {
  return fns.map(fn => fn(x)) as { [K in keyof Fs]: Fs[K] extends (x: T) => infer R ? R : never }
}

使用示例

// 输入2,依次执行加1、乘2、转字符串三个函数
const result = juxt(2, [
  (x) => x + 1,
  (x) => x * 2,
  (x) => x.toString()
])
// result 类型自动推断为 [number, number, string]
// 运行时结果为 [3, 4, "2"]

内容的提问来源于stack exchange,提问作者Aron Griffis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 14:15:02