我可以为 juxt 函数使用映射的元组类型吗?
Can I used mapped tuple types for the juxt function?
juxt 调用函数数组 return 值数组。文档:ramda clojure
我正在尝试键入一个没有覆盖的数据优先版本,但我不知道如何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'.
这在 TypeScript 中可行吗?
我不确定为什么 ReturnType
不起作用。然而,这里有一个替代方案:
type JuxtFn<T> = (x: T) => any
function juxt<T, FS extends readonly JuxtFn<T>[]>(
x: T,
fns: FS,
) {
return fns.map(fn => fn(x)) as unknown as { [K in keyof FS]: FS[K] extends (x:any)=>infer X ? X : never}
游乐场完整 here。有帮助吗?
考虑在这种情况下使用函数重载:
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)]
)
我添加了条件类型 Fns[K] extends Fn ? ReturnType<Fns[K]> : never
只是为了确保 TypeScript Fns[K]
是一个函数
您可以找到有关推断 return 类型 [].map
的更多信息。这已合并,然后还原。
为了更好地理解此语法 [...Fns]
请参阅 variadic tuple types
的文档
juxt 调用函数数组 return 值数组。文档:ramda clojure
我正在尝试键入一个没有覆盖的数据优先版本,但我不知道如何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'.
这在 TypeScript 中可行吗?
我不确定为什么 ReturnType
不起作用。然而,这里有一个替代方案:
type JuxtFn<T> = (x: T) => any
function juxt<T, FS extends readonly JuxtFn<T>[]>(
x: T,
fns: FS,
) {
return fns.map(fn => fn(x)) as unknown as { [K in keyof FS]: FS[K] extends (x:any)=>infer X ? X : never}
游乐场完整 here。有帮助吗?
考虑在这种情况下使用函数重载:
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)]
)
我添加了条件类型 Fns[K] extends Fn ? ReturnType<Fns[K]> : never
只是为了确保 TypeScript Fns[K]
是一个函数
您可以找到有关推断 return 类型 [].map
为了更好地理解此语法 [...Fns]
请参阅 variadic tuple types