具有功能的Typescript中的映射类型

时间:2019-01-25 13:55:10

标签: javascript typescript redux reselect

我在使用映射类型时遇到了一些麻烦。

我正在尝试键入一个组成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中的错误)

1 个答案:

答案 0 :(得分:2)

您的问题实际上很简单。 inferredSelectorCreator接受类型为T的rest参数,但是当您调用时,您需要对整个数组调用inferredSelectorCreator,而不进行扩展(inferredSelectorCreator(selectors)),这意味着{{1} }将被推断为T而不是[[Selector<string, string>, Selector<string, number>]]

如果使用点差,您将得到预期的结果:

[Selector<string, string>, Selector<string, number>]