9-23,9-24作业

来源:10-23 【高级类型Required] 融合Vue3源码+ 多级接口掌握Required +ReadOnly,Partial作业

匆匆又夏天丶

2021-09-23

怎么实现完成这个数组 只允许保留 title 和 completed这两个属性然后扁平化

interface Todo {
  title: string;
  completed: boolean;
  description: string;
}

let todoList: Todo[] = [
  {
    title: '开发权限管理模块',
    completed: true,
    description: '使用vue3+typescript来开发'
  },
  {
    title: '年会',
    completed: false,
    description: '12月29日上午菲亚特大酒店'
  }
];

// 作业:怎么实现完成这个数组 只允许保留 title 和 completed这两个属性

type Record<T> = {
  [P in keyof any]: T;
};

// type A = {
//   title: string;
//   completed: boolean;
// }
type A = Pick<Todo, 'title' | 'completed'>;

// type B = {
//   [x: string]: A;
// }
type B = Record<A>;

function convertSubTodoItemList() {
  return todoList.reduce((prev, item) => {
    return {
      ...prev,
      [item.title]: item
    };
  }, {} as Record<Pick<Todo, 'title' | 'completed'>>);
}

Required修饰后属性多了

CompileErrorType 继承了 SyntaxError,而 SyntaxError 又继承了别的接口,最终多出来的属性都是继承过来的。

写回答

1回答

keviny79

2021-09-23

//  老师现在给出 9-23 的 最终答案

//  答案1: 见 S100 处修改

function convertSubTodoItemList() {

  // reduce 第二个参数是 Todo 类型,所以可以解构成{ title, completed }

  return todoList.reduce((prev, { title, completed }) => { //S100 不能写成 item

    return {

      ...prev,

      [title]: { title, completed }

    };

  }, {} as Record<A>);

}

// 答案2:

let subTodoItemList: Record<Pick<Todo, "title" | "completed">> =

  { "title": { "title": "df", completed: false } }

function convertSubTodoItemList(subTodoItemList: Record<Pick<Todo, "title" | "completed">> = {}) {

  todoList.forEach(({ title, completed }) => {

    subTodoItemList[title] = { title, completed }

  })

  return subTodoItemList

}

console.log(convertSubTodoItemList())


1
0

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

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

871 学习 · 425 问题

查看课程