interface Logger {
time: number;
asyncLog:(msg: string) => Promise<string>
syncLog:(msg: string) => number;
}
//需求: 提取出为函数类型的属性,丢弃掉其它类型的属性 2. 将函数返回类型调整为形参类型(假定有且只有一个参数)
//步骤1. 先实现一个类型可以提取出指定类型,用来筛选出所有为函数类型的属性
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";
// }
//步骤2. 在 1 的基础上剔除 never,取出所有 key
type FilterKeys<T, U> = FilterTypes<T, U>[keyof T];
// 看看阶段性成果
type T2 = FilterKeys<Logger, Function>;
// type T2 = "syncLog" | "asyncLog"
//步骤3. 在 2 的基础上我们可以使用 Pick 提取出子类型
type SubType<T, U> = Pick<T, FilterKeys<T, U>>;
// 看看阶段性成果,此时我们已经成功提取出了所有类型为函数的属性,满足要求
type T3 = SubType<Logger, Function>;
// type T3 = {
// syncLog: (msg: string) => number;
// asyncLog: (msg: string) => Promise<string>;
// }
//步骤4. 在 3 的基础上我们再使用 infer 将函数的返回类型改为形参类型
// 将参数类型作为返回类型
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 Translate = {
// asyncLog: (arg: string) => string;
// syncLog: (arg: string) => string;
// }
ts:interface、type、keyof、in、extends、infer使用示例
于 2024-07-11 10:52:16 首次发布