由网友(20.心癌晚期)分享简介:JUXT调用函数数组以返回值的数组。文档:ramdaclojure我正在尝试键入不带覆盖的数据优先版本,但我想不出如何map the tuple of functions to their return values。这是我所拥有的:type JuxtFn = (x: T) => anyfunction j...JUXT调用函数数组以返回值的数组。文档:ramdaclojure
我正在尝试键入不带覆盖的数据优先版本,但我想不出如何map the tuple of functions to their return values。这是我所拥有的:
type JuxtFn<T> = (x: T) => any
function juxt<T, Fs extends JuxtFn<T>[]>(
x: T,
fns: Fs,
): {[K in keyof Fs]: ReturnType<Fs[K]>} {
return fns.map(fn => fn(x))
}
投诉(以及其他投诉)
Type 'Fs[K]' does not satisfy the constraint '(...args: any) => any'.
这在打字稿中可行吗?
推荐答案
在这种情况下考虑使用函数重载:
type JuxtFn<T> = (x: T) => any
function juxt<T, Fn extends JuxtFn<T>, Fns extends Fn[]>(
x: T,
fns: [...Fns],
): { [K in keyof Fns]: Fns[K] extends Fn ? ReturnType<Fns[K]> : never }
function juxt<T, Fs extends JuxtFn<T>[]>(
x: T,
fns: Fs,
) {
return fns.map(fn => fn(x))
}
// [string[], Promise<number>]
const result = juxt(
10,
[(v: number) => ['s'], (v: number) => Promise.resolve(42)]
)
Playground
我添加了条件类型Fns[K] extends Fn ? ReturnType<Fns[K]> : never
只是为了确保Fns[K]
是一个函数
您可以找到更多关于推断[].map
here的返回类型的信息。这已合并,然后还原。
为了更好地理解此语法[...Fns]
,请参阅variadic tuple types的文档
相关推荐
最新文章