extends 泛型约束

我们一般使用extends来继承接口或者类,但是extends还可以用来泛型约束

function getCnames<T extends { name: string }>(entities: T[]):string[] {return entities.map(entity => entity.cname)
}

比如,以上代码对传入的参数进行了约束,传入的参数必须要有name这个属性,否则就会出错

条件类型与高阶类型

extends还有一大用途就是用来判断一个类型是不是可以分配给另一个类型,这在写高级类型的时候非常有用,举个例子

  type Lihua = {name: string;}type Xiaoming = {name: string;}type Bool = Lihua extends Xiaoming ? 'yes' : 'no'; // Bool => 'yes'

LihuaXiaoming这两个类型都有name这个属性,而且类型是相同的,所以最后的结果是yes

  type Human = {name: string;occupation: string;}type Duck = {name: string;}type Bool = Duck extends Human ? 'yes' : 'no'; // Bool => 'no'

而这段代码中,Duck中并不存在Human中相关属性,所以Duck不满足约束条件,所以最后返回的是no

当我们给Human加上一个occupation属性,发现此时Bool'no',这是因为 Duck 没有类型为stringoccupation属性,类型Duck不满足类型Human的类型约束。因此,A extends B,是指类型A可以分配给类型B,而不是说类型A是类型B的子集,理解extends在类型三元表达式里的用法非常重要。

  type A1 = 'x' extends 'x' ? string : number; // stringtype A2 = 'x' | 'y' extends 'x' ? string : number; // numbertype P<T> = T extends 'x' ? string : number;type A3 = P<'x' | 'y'> // string | number

P是带参数T的泛型类型,其表达式和A1,A2的形式完全相同,A3是泛型类型P传入参数'x' | 'y'得到的类型

对于使用extends关键字的条件类型(即上面的三元表达式类型),如果extends前面的参数是一个泛型类型,当传入该参数的是联合类型,则使用分配律计算最终的结果。分配律是指,将联合类型的联合项拆成单项,分别代入条件类型,然后将每个单项代入得到的结果再联合起来,得到最终的判断结果。

Ts extends 泛型约束相关推荐

  1. TypeScript泛型约束

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

  2. TS:泛型的使用方法

    TS:泛型 1. 前言 有时候,我们想让一个函数的参数和返回类型是相同的,就可以使用类型变量. 类型变量是一种特殊的变量,用于表示类型而不是值. function identity<T>( ...

  3. 【TS】泛型 Generics

    泛型Generics,是指在定义函数Function.接口Interface 或类 Class 时不预先指定具体的类型,而是在使用的时候再指定类型的一种特征. // 函数名后的 <> 内传 ...

  4. 学习TypeScript 之 Pick与泛型约束

    何为Pick? type Pick<T, K extends keyof T> = {[key in K]: T[key] } 就是从一个复合类型中,取出几个想要的类型的组合,例如: // ...

  5. .NET支持的泛型约束

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

  6. 淡谈泛型约束T(转)

    .net泛型约束 2007-10-06 14:08:54|  分类: .net |字号 订阅 所谓泛型,即通过参数化类型来实现在同一份代码上操作多种数据类型.泛型编程是一种编程范式,它利用" ...

  7. C#高级语法之泛型、泛型约束,类型安全、逆变和协变(思想原理)

    一.为什么使用泛型? 泛型其实就是一个不确定的类型,可以用在类和方法上,泛型在声明期间没有明确的定义类型,编译完成之后会生成一个占位符,只有在调用者调用时,传入指定的类型,才会用确切的类型将占位符替换 ...

  8. 第五节:泛型(泛型类、接口、方法、委托、泛型约束、泛型缓存、逆变和协变)

    一. 泛型诞生的背景 在介绍背景之前,先来看一个案例,要求:分别输出实体model1.model2.model3的id和name值,这三个实体有相同的属性名字id和name. 1 public cla ...

  9. 【整理】C#2.0泛型编程之概述、default()方法、别名指定与泛型约束

    泛型概述 首先我们看一个在泛型出现之前通用的数据结构示例 通用数据结构类 Code public class Stack {     object[] m_Items;     public Stac ...

最新文章

  1. 等差数列连续异或模板
  2. React (native) 相关知识
  3. order one question for the 4e4 exploitation
  4. 基于Asp.Net Core打造轻量级内部服务治理RPC(一)
  5. xs资料网-产品设计图档下载_proe玩具车3D模型图档下载creo4.0汽车模型下载中磊教育...
  6. ps导出gif颜色不对_PS基础知识(1)
  7. golang语言中bytes包的常用函数,Reader和Buffer的使用
  8. PHP运行出现502是什么原因,php出现502错误怎么解决
  9. SpringBoot 入门
  10. 常见的SQL面试题: 经典50题
  11. Android-Dialogs(一) AlterDialog基本使用
  12. Scipy-kmeans聚类色彩提取
  13. 查询数据库表修改记录的sql语句
  14. 机器人体验营笔记(二)基础
  15. VScode调用KEIL-MDK
  16. 小队pkc++_骑士小队2人金属第一印象
  17. Mysql 1607错误
  18. Redis5搭建集群
  19. Appium的入门使用
  20. 讲一个api网页全部保存到本地_WebRTC在网页端音视频通话的技术实践

热门文章

  1. 各大IT技术博客排行榜--2014
  2. 一场火锅,看清了马云!
  3. linux acpi 作用,Linux ACPI服务ACPI 驱动体系简介
  4. java线程运行的时间片长度_CPU核心数,线程数,时间片轮转机制解读
  5. 大二上学期 自我总结
  6. ios 清除一个app的缓存
  7. 前端脚手架开发(1)
  8. 高速PCB Layout设计要用哪些工具?
  9. 过年整点花活:Python修仙等级测试【限时版】~ 邻居家的小屁孩可以拿来测试一下......
  10. 3D模型下载 - 3D模型免费下载