9-27作业

来源:10-25 面试题——百度复杂面试题

且听风吟720

2022-02-26

老师好,最终结果我最后可以实现,但是对FoodModule里面两个方法各自的属性的抓取,好像有点问题,还麻烦老师帮忙看一下

// 面试题:用keyof和infer处理复杂泛型问题
interface Action<T = any> {
  type: string;
  payload?: T;
}

class FoodModule {
  public static topic: string;
  public count!: number;
  delay(promise: Promise<number>) {
    return promise.then((second: number) => ({
      type: "delay",
      payload: `延迟${second}秒`
    }))
  }

  searchFoodByCity(action: Action<string>) {
    return {
      payload: action.payload,
      type: "searchFoodByCity"
    }
  }
}

// 要求1:实现方法名称
type AsyncMethodConnect<T, U> = (input: Promise<T>) => Promise<Action<U>>;
type SyncMethodConnect<T, U> = (action: Action<T>) => Action<U>;

// 要求2:把两个类型和原先的类合并成一个对象
// 所有方法名
type FoodModuleFuncKeys = Exclude<keyof FoodModule, "count">;
// 对比指定类型获取
type AsyncAndSyncFunc<T> =
  T extends AsyncMethodConnect<infer P, infer U> ? AsyncMethodConnect<P, U> :
  T extends SyncMethodConnect<infer P, infer U> ? SyncMethodConnect<P, U> : any;
// 综合输出结果
type Convert = {
  [P in FoodModuleFuncKeys]: AsyncAndSyncFunc<FoodModule[P]>
}

// TODO: 问题在这儿:分别抓两个方法的类型
type AsyncFunc<T> = T extends AsyncMethodConnect<infer P, infer U> ? AsyncMethodConnect<P, U> : any;
type SyncFunc<T> = T extends SyncMethodConnect<infer P, infer U> ? SyncMethodConnect<P, U> : any;

type FoodModuleDelay = AsyncFunc<FoodModule["delay"]>;
type FoodModuleSearch = SyncFunc<FoodModule["searchFoodByCity"]>;
写回答

1回答

keviny79

2022-02-27

且听风吟720:这是作业,保证其他同学还有思考的空间,我就把解答的通过群转过去

0
2
keviny79
回复
Mars李思源
刚看到,不好意思,533983954
2022-07-09
共2条回复

晋级TypeScript高手,成为抢手的前端开发人才

轻松驾驭 TypeScript 高级用法, 突破前端成长瓶颈

871 学习 · 425 问题

查看课程