何为Pick?

type Pick<T, K extends keyof T> = {[key in K]: T[key]
}

就是从一个复合类型中,取出几个想要的类型的组合,例如:

// 原始类型
interface TState {name: string;age: number;like: string[];
}
// 如果我只想要name和age怎么办,最粗暴的就是直接再定义一个(我之前就是这么搞得)
interface TSingleState {name: string;age: number;
}
// 这样的弊端是什么?就是在Tstate发生改变的时候,TSingleState并不会跟着一起改变,所以应该这么写
interface TSingleState extends Pick<TState, "name" | "age"> {};

写到这里,Pick的用法就写完了,但是会有个疑问,extends不是用来继承的么?那为什么可以写在泛型里?有没有人跟我一样的疑惑?
我去查了资料后发现,还是官方文档中有这个解释(所以还是要多看文档,官方文档大多数比外面写的好得多),以下这段内容来自于官方文档。

泛型约束《官方文档传送门》

你应该会记得之前的一个例子,我们有时候想操作某类型的一组值,并且我们知道这组值具有什么样的属性。 在 loggingIdentity例子中,我们想访问arg的length属性,但是编译器并不能证明每种类型都有length属性,所以就报错了。

function loggingIdentity<T>(arg: T): T {console.log(arg.length);  // Error: T doesn't have .lengthreturn arg;
}

相比于操作any所有类型,我们想要限制函数去处理任意带有.length属性的所有类型。 只要传入的类型有这个属性,我们就允许,就是说至少包含这一属性。 为此,我们需要列出对于T的约束要求。

为此,我们定义一个接口来描述约束条件。 创建一个包含 .length属性的接口,使用这个接口和extends关键字来实现约束:

interface Lengthwise {length: number;
}function loggingIdentity<T extends Lengthwise>(arg: T): T {console.log(arg.length);  // Now we know it has a .length property, so no more errorreturn arg;
}

现在这个泛型函数被定义了约束,因此它不再是适用于任意类型:

loggingIdentity(3);  // Error, number doesn't have a .length property

我们需要传入符合约束类型的值,必须包含必须的属性:

loggingIdentity({length: 10, value: 3});

---------------------------------文档结束--------------------------------------
这是找到的唯一一处跟我的问题比较吻合的答案了,至此我们直到了在泛型中使用extends并不是用来继承的,而是用来约束类型的。所以这个K extends keyof T,应该是说key被约束在T的key中,不能超出这个范围,否则会报错的。
不知道你们理解了么~如果没有理解的话,可以留言告诉我,我们再讨论讨论。

学习TypeScript 之 Pick与泛型约束相关推荐

  1. TypeScript 学习笔记(四)--- 泛型(Generics)

    (注明:目前泛型理解不够清晰,先照葫芦画瓢,整理一个粗略版本,后续会再次补充) 一.泛型的概念 ​ 在TS中,泛型(Generics)是一种创建可复用代码的方式,类似于代码组件的概念.具体来说,就是在 ...

  2. TypeScript泛型约束

    泛型约束 有了泛型之后,一个函数或容器类能处理的类型一下子扩到了无限大,似乎有点失控的感觉.所以这里又产生了一个约束的概念.我们可以声明对类型参数进行约束. 我们还拿上文中的student栗子来说,想 ...

  3. 作为前端开发,如何高效学习 TypeScript

    大家好,我是若川.有朋友跟我说最近面试前端候选人,问到关于 JavaScript 的一些少见误区问题,候选人很多都没回答上来,他很诧异,一个从国际大厂出来的面试者,竟然对 JavaScript 的一些 ...

  4. TypeScript(七)泛型、声明合并、扩展阅读

    TypeScript(七)泛型.声明合并.扩展阅读 文章目录 TypeScript(七)泛型.声明合并.扩展阅读 1. 泛型 简单的例子 多个类型参数 泛型约束 泛型接口 泛型类 泛型参数的默认类型 ...

  5. 学习TypeScript(TS),这一篇就足够了

    一.TypeScript 简介 1.什么是 TypeScript? 官方文档 TypeScript 本质上是向 JavaScript 语言添加了「可选的静态类型」和「基于类的面向对象」编程,它相当于是 ...

  6. 学习Kotlin(四)对象与泛型

    推荐阅读: 学习Kotlin(一)为什么使用Kotlin 学习Kotlin(二)基本语法 学习Kotlin(三)类和接口 学习Kotlin(四)对象与泛型 学习Kotlin(五)函数与Lambda表达 ...

  7. 深入浅出学习 TypeScript 语言

    课程简介 2012年10月,微软发布了首个公开版本的 TypeScript,2013年6月19日,在经历了一个预览版之后微软发布了正式版 TypeScript 0.9.TypeScript 是 Jav ...

  8. Java学习 第十六天(泛型)

    Java学习 第十六天---泛型与集合 第一章 泛型 1.1 泛型概述 1.2 泛型类 1.3 泛型类练习---抽奖问题 1.4 泛型类的子类 1.5 泛型接口 1.6 重写泛型父类或泛型接口中方法的 ...

  9. .NET支持的泛型约束

    .NET支持的类型参数约束有以下五种: where T : struct | T必须是一个结构类型 where T : class T必须是一个类(class)类型 where T : new() | ...

最新文章

  1. 我看过的密码学方面的好文章
  2. RMAN duplicate database到新主机
  3. 程序员的24小时,简单纯粹又扎心...
  4. 【学习笔记】Dilworth 定理的构造性证明
  5. 2018第九届蓝桥杯省赛真题 C语言B组 第一题
  6. 分布与并行计算—生命游戏(Java)
  7. Linux有问必答:如何更新过期版本的Ubuntu
  8. oracle 表的移动,oracle 表移动表空间
  9. QT for android 比较完美解决 全屏问题
  10. Java怎么用继承回复信息_JAVA面向对象-继承
  11. CentOS7中使用systemctl列出启动失败的服务
  12. addr 与 offset 异同
  13. 使用源代码编译安装基于LAMP的网站架构
  14. 欧姆龙服务器显示oE,欧姆龙CP1H-E系列PLC实现Modbus TCP\RTU\ASCII通信视频教程
  15. Android深色模式适配
  16. 管理hiberfil.sys文件与pagefile.sys文件释放C盘
  17. 【翻译】 Unity3D VR 教程:1.VR概述
  18. 传统研发团队的敏捷转型实践之路
  19. 独家-县域统计年鉴Excel版(2000-2021年)-包含县市及乡镇卷
  20. 幅相曲线渐近线_幅相频率特性曲线.PPT

热门文章

  1. dump文件 修复iat_在OD中手工修复IAT重定向
  2. 国家级重点实验室申报流程是什么?
  3. 为什么要将模拟地和数字地分开,如何分开?
  4. Ubuntu 桌面视频录制与格式转换
  5. [DSA] 数字血管造影系统-软件篇
  6. IDEA2022如何创建web项目
  7. 怎么把pdf转换成图片?这个方法你值得拥有
  8. 蘑菇车联:让车更聪明,学会感知和思考
  9. mysql5.7免安装版本的配置+navicat的安装配置(超详细)
  10. Burp Suit pro:the supplied license key was not recognized