【发布时间】:2021-03-10 07:09:11
【问题描述】:
我正在尝试键入以下函数:
function foo(input, modifier, merge) {
return merge(...modifier.map(m => m(input)));
}
目标是为merge 函数的参数提供正确的类型。
上下文:
-
modifier是一个函数数组,具有typeof input类型的单个参数和每个函数的不同返回类型 -
merge是一个函数,它有modifier.length参数,位置n的参数与函数modifier[n]的返回类型相同,并返回一个单一(通用)值
如何做到这一点?
编辑:替代问题
可以使用对象 (Record<K,V>):
// for Functions (here type Func)
type Func = () => any;
// a mapping of a string key to an function can be created
type FuncMap = Record<string, Func>;
// for this mapping you can create a mapping to the return types of each function
type ReturnTypeMap<T extends FuncMap> = { [K in keyof T]: ReturnType<T[K]> }
基于位置而不是对象键的数组是否也可以这样做?
这是我在键入函数时的尝试,但我不知道如何将 ReturnType 与数组结合使用:
function foo<I, M extends Array<(input: I) => any>, O>(
input: I,
modifier: M,
merge: (...args: ReturnType<M>) => O
// ^^^^^^^^^^^^^ this is not working, since relation to each item is missing
): O {
return merge(...modifier.map(m => m(input)));
}
【问题讨论】:
-
modifier应该是什么?一系列函数,但它们应该是吗?merge是什么? -
更新问题以澄清
modifier和merge -
好的,所以你可以有类似
input = "foo"的东西,它们modifier.map(m => m(input))可能会产生,比如[42, "bar", true]。merge函数应该接受所有这些并产生一些单一的值。如果我正确阅读了描述,在这个例子中,merge应该产生boolean,因为这是最后一个值。对吗? -
不,merge的返回类型是泛型的;更新的问题
-
但是,你的其他假设是正确的
标签: typescript typescript-typings typescript-generics