Ts extends 泛型约束
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'
Lihua
和Xiaoming
这两个类型都有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 没有类型为string
的occupation
属性,类型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 泛型约束相关推荐
- TypeScript泛型约束
泛型约束 有了泛型之后,一个函数或容器类能处理的类型一下子扩到了无限大,似乎有点失控的感觉.所以这里又产生了一个约束的概念.我们可以声明对类型参数进行约束. 我们还拿上文中的student栗子来说,想 ...
- TS:泛型的使用方法
TS:泛型 1. 前言 有时候,我们想让一个函数的参数和返回类型是相同的,就可以使用类型变量. 类型变量是一种特殊的变量,用于表示类型而不是值. function identity<T>( ...
- 【TS】泛型 Generics
泛型Generics,是指在定义函数Function.接口Interface 或类 Class 时不预先指定具体的类型,而是在使用的时候再指定类型的一种特征. // 函数名后的 <> 内传 ...
- 学习TypeScript 之 Pick与泛型约束
何为Pick? type Pick<T, K extends keyof T> = {[key in K]: T[key] } 就是从一个复合类型中,取出几个想要的类型的组合,例如: // ...
- .NET支持的泛型约束
.NET支持的类型参数约束有以下五种: where T : struct | T必须是一个结构类型 where T : class T必须是一个类(class)类型 where T : new() | ...
- 淡谈泛型约束T(转)
.net泛型约束 2007-10-06 14:08:54| 分类: .net |字号 订阅 所谓泛型,即通过参数化类型来实现在同一份代码上操作多种数据类型.泛型编程是一种编程范式,它利用" ...
- C#高级语法之泛型、泛型约束,类型安全、逆变和协变(思想原理)
一.为什么使用泛型? 泛型其实就是一个不确定的类型,可以用在类和方法上,泛型在声明期间没有明确的定义类型,编译完成之后会生成一个占位符,只有在调用者调用时,传入指定的类型,才会用确切的类型将占位符替换 ...
- 第五节:泛型(泛型类、接口、方法、委托、泛型约束、泛型缓存、逆变和协变)
一. 泛型诞生的背景 在介绍背景之前,先来看一个案例,要求:分别输出实体model1.model2.model3的id和name值,这三个实体有相同的属性名字id和name. 1 public cla ...
- 【整理】C#2.0泛型编程之概述、default()方法、别名指定与泛型约束
泛型概述 首先我们看一个在泛型出现之前通用的数据结构示例 通用数据结构类 Code public class Stack { object[] m_Items; public Stac ...
最新文章
- 等差数列连续异或模板
- React (native) 相关知识
- order one question for the 4e4 exploitation
- 基于Asp.Net Core打造轻量级内部服务治理RPC(一)
- xs资料网-产品设计图档下载_proe玩具车3D模型图档下载creo4.0汽车模型下载中磊教育...
- ps导出gif颜色不对_PS基础知识(1)
- golang语言中bytes包的常用函数,Reader和Buffer的使用
- PHP运行出现502是什么原因,php出现502错误怎么解决
- SpringBoot 入门
- 常见的SQL面试题: 经典50题
- Android-Dialogs(一) AlterDialog基本使用
- Scipy-kmeans聚类色彩提取
- 查询数据库表修改记录的sql语句
- 机器人体验营笔记(二)基础
- VScode调用KEIL-MDK
- 小队pkc++_骑士小队2人金属第一印象
- Mysql 1607错误
- Redis5搭建集群
- Appium的入门使用
- 讲一个api网页全部保存到本地_WebRTC在网页端音视频通话的技术实践