上一主题 下一主题
ScriptCat,新一代的脚本管理器脚本站,与全世界分享你的用户脚本油猴脚本开发指南教程目录
返回列表 发新帖
楼主: 李恒道 - 

typescript类型体操记录贴(二)Pick

[复制链接]
  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    712

    主题

    5960

    回帖

    6759

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6759

    荣誉开发者喜迎中秋油中2周年生态建设者

    发表于 2022-7-18 00:24:49 | 显示全部楼层 | 阅读模式

    地址
    https://github.com/type-challenges/type-challenges/blob/main/questions/00004-easy-pick/README.md

    题目

    Implement the built-in Pick<T, K> generic without using it.
    
    Constructs a type by picking the set of properties K from T
    
    For example:

    实现内置的pcik泛型而不使用原生函数
    构造一个类型去选择设置的属性K来自T泛型
    例如

    interface Todo {
      title: string
      description: string
      completed: boolean
    }
    
    type TodoPreview = MyPick<Todo, 'title' | 'completed'>
    
    const todo: TodoPreview = {
        title: 'Clean room',
        completed: false,
    }

    可以看到传入了一个类型以及选择的属性名
    从新构造出了一个类型
    关于Pick类型的使用可以参考
    https://www.typescriptlang.org/docs/handbook/utility-types.html

    Constructs a type by picking the set of properties Keys (string literal or union of string literals) from Type.
    构造一个类型来自接受设置的属性keys,其key需要来自类型
    interface Todo {
      title: string;
      description: string;
      completed: boolean;
    }
    
    type TodoPreview = Pick<Todo, "title" | "completed">;
    
    const todo: TodoPreview = {
      title: "Clean room",
      completed: false,
    };

    这个题目很明显是通过[]操作符以及in操作符做了
    我们通过in可以遍历"title" | "completed"类型
    每次取出来一个
    那么我们先写一个代码

    type MyPick<T, K > = {
      [P in K] : T[P]
    }

    我们可以看到报错了
    图片.png
    Type 'K' is not assignable to type 'string | number | symbol'.
    Type 'P' cannot be used to index type 'T'.
    K不能分配给类型string balabal
    P不能被使用在索引类型T
    所以我们要解决2个问题
    1.限定K的范围
    2.限定K的范围得到的P同时也可以作为T的索引类型
    那么这时候我们就可以写K extends keyof T
    keyof是将T的所有属性组成一个合并类型

    interface Person {
    name : string;
    age : number ;
    }

    type PersonType = keyof Person;
    这时候PersonType就是'name'|'age'
    extends代表K是T的属性的联合的更具体的子类型
    比如'name'|'age'|'school'
    三个里抽1-3个任何数量凑一起都叫他的子类型
    我们继续写
    那我们直接限定K继承T的属性的集合

    type MyPick<T, K extends keyof T > = {
      [P in K] : T[P]
    }

    通关
    图片.png

    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。

    发表回复

    本版积分规则

    快速回复 返回顶部 返回列表