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
相关产品推荐
相关产品推荐

