Typescript泛型扩展了泛型?

dsekswqp  于 2023-01-14  发布在  TypeScript
关注(0)|答案(1)|浏览(143)

我尝试在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定义为具有一个类型参数的泛型?

knpiaxh1

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
    }
    */

相关问题