当前位置:网站首页>【ts】typescript高阶:条件类型与infer
【ts】typescript高阶:条件类型与infer
2022-08-05 05:16:00 【六月的可乐】
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
typescript高阶之件类型与infer
前言
学习目标
1、学习ts中的条件类型extends
2、infer用于存储类型推断出的类型
3、UnpackedArray、UnpackedFn、Unpacked、PropertyType、UnionToIntersection工具类型的实现
提示:以下是本篇文章正文内容,下面案例可供参考
一、s中的条件类型extends
1、条件类型的语法
// 条件类型(其中extends可以理解为T类型(窄类型)是否是U类型(宽类型)的子类型,或者说T类型是否可以赋值给U类型,语法同js的三元表达式)
T extends U ? U : T;
2、infer的使用
- infer只能在extends类型语句中使用
- infer存储的变量U只能用于语句的true返回分支
//
type UnpackedArray<T> = T extends (infer U)[] ? U : T;
3、infer的新特性
- infer在推断元组类型使用中可以简写
// 不简写
type FirstString<T> = T extends [infer R, ...unknown[]] ? R extends string ? R : never : never;
// 简写
type FirstStringE<T> = T extends [infer R extends string, ...unknown[]] ? R : never;
type A = FirstString<[string, number, boolean]>; // string
type B = FirstString<['hello', number, boolean]>; // 'hello'
type C = FirstString<['hello' | 'word', number, boolean]>; // 'hello' | 'word'
type H = FirstString<[number, boolean]>; // never
二、工具类型的实现
1.UnpackedArray
功能:获取数组类型的值类型
代码如下(示例):
type Arr = string[];
// 工具类型
type UnpackedArray<T> = T extends (infer R)[] ? R : T;
type newArr = UnpackedArray<Arr>; // string
2.UnpackedFn
功能:获取函数返回值类型
代码如下(示例):
type fn = (x: boolean) => number;
// 函数重载工具类型将取最后一个函数的定义
declare function foo(x: number): number;
declare function foo(x: string): string;
declare function foo(x: string | number): string | number;
// 工具类型
type UnpackedFn<T> = T extends (...ags: any[]) => (infer R) ? R : T;
type Fn2 = UnpackedFn<typeof foo>;// string | number
type Fn3 = UnpackedFn<fn>; // number
3.PropertyType
功能:获取对象类型的key类型
代码如下(示例):
type User = {
name: string;
age: number;
};
// 工具类型
type PropertyType<T> = T extends {
name: infer R; age: infer U} ? [R, U] : T;
type Pro1 = PropertyType<User>; // [string, number]
逆变位置交叉类型
type User = {
a: (x: string) => void;
b: (x: number) => void;
};
// 工具类型
// 注意:这里是逆变位置应该参数R存多个值 取交叉类型运算
type PropertyType<T> = T extends {
a: (x: infer R) => void; b: (x: infer R) => void} ? R: T;
type Pro1 = PropertyType<User>; // string & number ⇒ nerver
协变位置联合类型
type User = {
a: string;
b: number;
};
// 工具类型
// 注意:这里是协变位置应该参数R存多个值 取联合类型运算
type PropertyType<T> = T extends {
a: infer R; b: infer R} ? R: T;
type Pro1 = PropertyType<User>; // string | number
4.UnionToIntersection
联合类型转交叉类型(原理就是利用infer逆变位置的特性)
ts是分布式类型分支匹配模式
type union = {
a: 'a'} | {
b: 'b'};
// 工具类型
type UnionToIntersection<T> = (T extends any ? (ags: T)=> void : never) extends (ags: infer R) => void ? R : never;
type Intersection = UnionToIntersection<union>;// {a: 'a'} & {b: 'b'}
5.Unpacked
通用获取类型的工具类型
// 工具类型
// 条件列
type UnPacked<T> = T extends (infer U)[] ? U : T extends (...ags: any[]) => infer R ? R : T extends Promise<infer U> ? U : T;
// 使用
type T0 = UnPacked<string>; // string
type T1 = UnPacked<string[]>; // string
type T3 = UnPacked<() => Number>; // Number
type T4 = UnPacked<Promise<string>>; // string
type T5 = UnPacked<UnPacked<Promise<string>>>; // string
总结
边栏推荐
- It turns out that the MAE proposed by He Yuming is still a kind of data enhancement
- 物联网-广域网技术之NB-IoT
- AIDL detailed explanation
- flink yarn-session的两种使用方式
- 用GAN的方法来进行图片匹配!休斯顿大学提出用于文本图像匹配的对抗表示学习,消除模态差异!
- [Pytorch study notes] 10. How to quickly create your own Dataset dataset object (inherit the Dataset class and override the corresponding method)
- 2022年中总结关键词:裁员、年终奖、晋升、涨薪、疫情
- 网络信息安全运营方法论 (上)
- 基于STM32F407的一个温度传感器报警系统(用的是DS18B20温度传感器,4针0.96寸OLED显示屏,并且附带日期显示)
- 《基于机器视觉测量系统的工业在线检测研究》论文笔记
猜你喜欢

伪RTOS-ProroThread在CH573芯片上的移植

基于STM32F407的一个温度传感器报警系统(用的是DS18B20温度传感器,4针0.96寸OLED显示屏,并且附带日期显示)

flink实例开发-详细使用指南

【论文阅读-表情捕捉】ExpNet: Landmark-Free, Deep, 3D Facial Expressions

【Kaggle项目实战记录】一个图片分类项目的步骤和思路分享——以树叶分类为例(用Pytorch)

ECCV2022 | RU & Google propose zero-shot object detection with CLIP!

【数据库和SQL学习笔记】7.SQL中的插入(INSERT)、删除(DELETE)、更新(UPDATE)

OSPF网络类型

11%的参数就能优于Swin,微软提出快速预训练蒸馏方法TinyViT

spingboot 容器项目完成CICD部署
随机推荐
基于Flink CDC实现实时数据采集(一)-接口设计
CVPR best paper winner Huang Gao's team from Tsinghua University presented the first dynamic network review
通过Flink-Sql将Kafka数据写入HDFS
AWS 常用服务
2022年中总结关键词:裁员、年终奖、晋升、涨薪、疫情
【MySQL】数据库多表链接的查询方式
表情捕捉的指标/图像的无参考质量评价
原来何恺明提出的MAE还是一种数据增强
吞吐?带宽?傻傻分不清楚
ES6 新特性:Class 的继承
哥廷根大学提出CLIPSeg,能同时作三个分割任务的模型
Service
OSPF故障排除办法
[Go through 9] Convolution
【Pytorch学习笔记】9.分类器的分类结果如何评估——使用混淆矩阵、F1-score、ROC曲线、PR曲线等(以Softmax二分类为例)
如何编写一个优雅的Shell脚本(二)
Detailed explanation of BroadCast Receiver (broadcast)
spingboot 容器项目完成CICD部署
Spark ML学习相关资料整理
门徒Disciples体系:致力于成为“DAO世界”中的集大成者。