【TS类型体操】easy-pick的实现

题目链接:Pick
内容实现参考B站视频:type-challenges本地刷题环境搭建 & easy-pick的实现
题目实现:
实现一个类型Pick<T, K>,从T属性中任意选择一系列的属性形成K

测试:

import type { Equal, Expect } from '@type-challenges/utils'

type cases = [
  Expect<Equal<Expected1, MyPick<Todo, 'title'>>>,
  Expect<Equal<Expected2, MyPick<Todo, 'title' | 'completed'>>>,
  // @ts-expect-error
  MyPick<Todo, 'title' | 'completed' | 'invalid'>,
]

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

interface Expected1 {
  title: string
}

interface Expected2 {
  title: string
  completed: boolean
}

JS实现

  • 函数myPick接收两个参数,一个是接口类型todo,一个是选择的属性keys
  • 返回值:对象obj
  • 过程:

1.返回一个对象
2.遍历
3. todo[key]取值
4. 判断key是否在todo中

function myPick(todo,keys){
  const obj = {}
  keys.forEach(key => {
    if(key in todo){
      obj[key] = todo[key]
    }
  });
  return obj
}

TS实现

  • keys相当于K,在TS中为联合类型(union)
  • 遍历联合类型:[P in K]
  • TS中对K进行约束,即K一定是存在T中:K extends keyof T
type MyPick<T, K extends keyof T> = {
  [P in K]:T[P]
}

总结

  1. TS中的遍历
    Mapped Types

  2. todo[key]的取值
    Indexed Access Types

  3. 取出接口中的所有key,也就是取出对象中的所有值
    Keyof Type Operator

  4. 类型约束
    Generic Constraints

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Vue3 TS环境下,使用Element Plus的el-table组件实现插入行可以按照以下步骤进行: 1. 安装Element Plus和Vue3: ``` npm install element-plus vue@next ``` 2. 在Vue3组件中引入el-table组件,并定义表格数据和列: ```vue <template> <el-table :data="tableData" :columns="tableColumns" :row-key="id" > </el-table> </template> <script lang="ts"> import { defineComponent } from 'vue'; import { ElTable, ElTableColumn } from 'element-plus'; import 'element-plus/lib/theme-chalk/index.css'; export default defineComponent({ components: { ElTable, ElTableColumn, }, data() { return { tableData: [ { id: 1, name: '张三', age: 18 }, { id: 2, name: '李四', age: 20 }, { id: 3, name: '王五', age: 22 }, ], tableColumns: [ { label: 'ID', prop: 'id' }, { label: '姓名', prop: 'name' }, { label: '年龄', prop: 'age' }, ], }; }, }); </script> ``` 3. 在表格中添加一个按钮,用于插入新行: ```vue <template> <el-table :data="tableData" :columns="tableColumns" :row-key="id" > <template #append> <el-button type="primary" @click="addRow">添加行</el-button> </template> </el-table> </template> <script lang="ts"> import { defineComponent } from 'vue'; import { ElTable, ElTableColumn, ElButton } from 'element-plus'; import 'element-plus/lib/theme-chalk/index.css'; export default defineComponent({ components: { ElTable, ElTableColumn, ElButton, }, data() { return { tableData: [ { id: 1, name: '张三', age: 18 }, { id: 2, name: '李四', age: 20 }, { id: 3, name: '王五', age: 22 }, ], tableColumns: [ { label: 'ID', prop: 'id' }, { label: '姓名', prop: 'name' }, { label: '年龄', prop: 'age' }, ], }; }, methods: { addRow() { const newRow = { id: 4, name: '赵六', age: 24 }; this.tableData.push(newRow); }, }, }); </script> ``` 4. 点击“添加行”按钮,即可将新行添加到表格的末尾。 上述代码中,我们在el-table组件内部添加了一个template标签,用于渲染“添加行”按钮。该按钮使用了Element Plus的el-button组件,并绑定了一个点击事件addRow。在addRow方法中,我们创建了一个新的行数据newRow,并使用数组的push方法将其添加到tableData数组中。由于tableData是响应式的,因此添加新行后,表格会自动更新。 需要注意的是,我们在el-table组件上添加了一个#append的插槽,该插槽用于渲染在表格底部的操作栏。在操作栏中,我们可以添加按钮、分页器等操作组件,以实现更多的交互效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值