我可以为JUXT函数使用映射的元组类型吗? [英] Can I used mapped tuple types for the juxt function?

查看:0
本文介绍了我可以为JUXT函数使用映射的元组类型吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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]是一个函数

您可以找到更多关于推断[].maphere的返回类型的信息。这已合并,然后还原。

为了更好地理解此语法[...Fns],请参阅variadic tuple types的文档

这篇关于我可以为JUXT函数使用映射的元组类型吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆