我在使用映射类型时遇到了一些麻烦。
我正在尝试键入一个组成redux“选择器”的函数(本质上只是INSERT INTO Mytable(<place field list, excluding id>) VALUES (<place field values>) RETURNING id
中的函数)
我想要的API基本上是:
SELECT setval('<your sequence name>', 3, true);
这是到目前为止我得到的:
A => B
这似乎很好用,直到我尝试在函数中使用const bar = composeSelectors([
(s: string) => s.length,
(s: string) => s.trim(),
])
bar // should be (s: string) => [number, string]
为止
type Selector<A, Z> = (a:A) => Z
type Selected<T> = T extends Selector<any, infer U> ? U : never;
type MappedSelector<S, T> = Selector<S, { [Y in keyof T]: Selected<T[Y]> }>
const selectedNumber: Selected<Selector<string, number>> = null as any
selectedNumber // is number
const baz: MappedSelector<string, [Selector<string, number>, Selector<string, string>]> = null as any
baz // is Selector<string, [number, string]> !!!
我也尝试过:
MappedSelector
(最后一点似乎是TS中的错误)
答案 0 :(得分:2)
您的问题实际上很简单。 inferredSelectorCreator
接受类型为T
的rest参数,但是当您调用时,您需要对整个数组调用inferredSelectorCreator
,而不进行扩展(inferredSelectorCreator(selectors)
),这意味着{{1} }将被推断为T
而不是[[Selector<string, string>, Selector<string, number>]]
。
如果使用点差,您将得到预期的结果:
[Selector<string, string>, Selector<string, number>]