TypeScript
type Whitespace = ' ' | '\n' | '\r' | '\t' type TrimStart<S extends string, P extends string = Whitespace> = S extends `${P}${infer R}` ? TrimStart<R, P> : Sinterface 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; // }type Split<S extends string, D extends string> = string extends S ? string[] : S extends '' ? [] : S extends `${infer T}${D}${infer U}` ? [T, ...Split<U, D>] : [S]; type T40 = Split<'foo', '.'>; // ['foo'] type T41 = Split<'foo.bar.baz', '.'>; // ['foo', 'bar', 'baz'] type T42 = Split<'foo.bar', ''>; // ['f', 'o', 'o', '.', 'b', 'a', 'r'] type T43 = Split<any, '.'>; // string[][-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20][Depth] , 做 递归下降 Depth extends -1 ? "done" : "recur" , hash做终止条件 Arr extends ReadonlyArray<infer InnerArr> 做模式匹配..type Rua<Arr> = Exclude<keyof Arr, keyof (typeof [])> type A = Rua<[1,2,3]>
Last updated









