3
interface Logger { time: number; asyncLog:(msg: string) => Promise<string>; syncLog:(msg: string) => number; } type Translate<T> = /** 你需要实现的部分 **/; // 要求 Translate // 1. 提取出为函数类型的属性,丢弃掉其它类型的属性 // 2. 将函数返回类型调整为形参类型(假定有且只有一个参数) // 实现效果如下: type T0 = Translate<Logger>; // 等价于 type T0 = { // 其它属性被丢弃 asyncLog: (arg: string) => string; // return 类型被调整为跟 arg 保持一致 syncLog: (arg: string) => string; // return 类型被调整为跟 arg 保持一致 } const result: T0 = { asyncLog(msg: string) { return msg } };type FilterTypes<T, U> = { [Key in keyof T]: T[Key] extends U ? Key : never }; // 看看阶段性成果 type T = FilterTypes<Logger, Function>; // type T = { // time: never; // syncLog: "syncLog"; // asyncLog: "asyncLog"; // }type FilterKeys<T, U> = FilterTypes<T, U>[keyof T]; // 看看阶段性成果 type T = FilterKeys<Logger, Function>; // type T = "syncLog" | "asyncLog"type SubType<T, U> = Pick<T, FilterKeys<T, U>>; // 看看阶段性成果,此时我们已经成功提取出了所有类型为函数的属性,满足要求 type T = SubType<Logger, Function>; // type T = { // syncLog: (msg: string) => number; // asyncLog: (msg: string) => Promise<string>; // }// 将参数类型作为返回类型 type ArgAsReturn<T> = { [K in keyof T]: T[K] extends ((arg: infer U) => any) ? ((arg: U) => U): never; } // 我们最终得到了 Translate type Translate = ArgAsReturn<SubType<Logger, Function>>; // 看看最后效果,满足要求 type T = Translate<Logger>; // type T0 = { // asyncLog: (arg: string) => string; // syncLog: (arg: string) => string; // }
Last updated

