我尝试在TS(TSPlayground)中构建一个Map功能:
type $TupleMap<T extends any[], F> = { [P in keyof T]: F<T[P]> }
这会让我在F<T[P]>位上说Type 'F' is not generic。如何将F定义为具有一个类型参数的泛型?
F<T[P]>
Type 'F' is not generic
F
knpiaxh11#
这里的关键是如何将类型Map到另一个类型.最简单的方法是使用这样的函数类型:
type TestMapper = ((p: boolean) => string) | ((p: string) => number);
以下是"应用"函数类型并获得Map类型的方法:
type $Apply<F extends (p: any) => any, P extends Parameters<F>[0]>= F extends ((p: P) => infer R) ? R : never;
如何使用这个:
type TFApplyedToString = $Apply<TestMapper, string>; // number type TFApplyedToBoolean = $Apply<TestMapper, boolean>; // string
现在我们需要Map元组:
type $Map<T, F extends (p: any) => any> = { [P in keyof T]: $Apply<F, T[P]>; }
最后:
type TFApplyedToTuple = $TupleMap<[string, boolean, string], TestMapper>; // [number, string, number]
作为奖励,你也可以Map对象:
type TFApplyedToObject = $Map<{ a: string, b: boolean, c: string }, TestMapper>; /* { a: number, b: string, c: number } */
1条答案
按热度按时间knpiaxh11#
这里的关键是如何将类型Map到另一个类型.
最简单的方法是使用这样的函数类型:
以下是"应用"函数类型并获得Map类型的方法:
如何使用这个:
现在我们需要Map元组:
最后:
作为奖励,你也可以Map对象: