ts:interface、type、keyof、in、extends、infer使用示例

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YU大宗师

任何技术娓娓道

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值