当前位置:网站首页>【ts】typescript高阶:分布式条件类型
【ts】typescript高阶:分布式条件类型
2022-08-05 05:16:00 【六月的可乐】
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
typescript高阶之分布式条件类型
前言
学习目标:
1、条件类型语法和例子
2、分布式条件类型语法和例子
3、什么是类型?什么是函数重载?
一、条件类型语法和例子
1、条件类型语法
ts中的条件类型可以类比js中的三元表达式
// 语法
T extends U ? X : Y;// 意思是:如果T类型是U类型的子类型(T是窄类型,U是宽类型),那么取类型X,否则取类型Y
2、条件类型的应用例子
// 条件类型的使用
//工具类型
type IsString<T> = T extends string ? true : false;
type T0 = IsString<number>; // false
type T1 = IsString<string>; // true
type T2 = IsString<'ab'>; // true
type T3 = IsString<string[]>; // false
type T4 = IsString<boolean>; // false
// any和never特殊
type T5 = IsString<any>; // boolean
type T6 = IsString<never>; // never
//工具类型
// 条件列中的使用
type TypeName<T> = T extends string ? 'string' :
T extends number ? 'number' :
T extends boolean ? 'boolean' :
T extends undefined ? 'undefined' :
T extends Function ? 'function' :
'object';
type T11 = TypeName<string>; // 'string'
type T12 = TypeName<string | ((x: number) => void)>; // 联合类型 =》'string' | 'function'
type T14 = TypeName<number | string[] | undefined>;// 联合类型=> 'number' | 'object' | 'undefined'
二、2、分布式条件类型语法和例子
1.分布式条件类型语法
1、语法和正常条件类型一样,不一样的是在于T类型参数的特性上
2、注意对于类型参数T而言除了T[]、[T]、 Promise三种类型外的其他类型都是“裸”类型参数,即需要进行分布式匹配
代码如下(示例):
// 语法和正常条件类型一样,不一样的是在于T类型参数的特性上
T extends U ? X : Y;
//注意对于类型参数T而言除了T[]、[T]、 Promise<T>三种类型外的其他类型都是“裸”类型参数,即需要进行分布式匹配
A | B | C extends U ? X : Y;// 等价下面写法
A extends U ? X : Y | B extends U ? X : Y | C extends U ? X : Y
2.分布式条件类型应用例子
代码如下(示例):
"裸"类型参数进行分布式匹配
// "裸"类型参数进行分布式匹配
type Naked<T> = T extends boolean ? 'Y' : 'N';
type N1 = Naked<string>; // 'N'
type N2 = Naked<boolean>; // 'Y'
非"裸"类型参数进行匹配
//非 "裸"类型参数匹配
type WrapperTuple<T> = [T] extends [number | string] ? 'Y' : 'N';
type WrapperArray<T> = T[] extends boolean[] ? 'Y' : 'N';
type WrapperPromise<T> = Promise<T> extends Promise<boolean> ? 'Y' : 'N';
type W1 = WrapperTuple<string | number>;// 'Y'
type W2 = WrapperArray<string | number>;// 'N'
type W3 = WrapperPromise<string | number>;// 'N'
3.Exclude实现原理
type Exclude<T, U> = T extends U ? never : T;
type T20 = Exclude<'a' | 'b' | 'c', 'a' | 'b'>;// 'c'
// ('a' extends 'a' | 'b' ? never : 'a') => 'never'
// ('b' extends 'a' | 'b' ? never : 'b') => 'never'
// ('c' extends 'a' | 'b' ? never : 'c') => 'c'
// 最终=》 never | never | ‘c’ => 'c'
4.NonFunctionpropertyNames
功能:获取对象类型的除了函数之外的key组成的联合类型
// 获取对象类型的除了函数之外的key组成的联合类型
type NonFunctionpropertyNames<T> = {
[K in keyof T]: T[K] extends Function ? never : K
}[keyof T];
type user = {
namd: string,
age: number,
id: boolean,
fn: Function
};
type Names = NonFunctionpropertyNames<user>;// "namd" | "age" | "id"
type NonFunctionProperties<T> = Pick<T, NonFunctionpropertyNames<T>>;
type Properyies = NonFunctionProperties<user>;//{ namd: string; age: number;id: boolean;}
三、什么是类型?什么是函数重载?
1、类型的本质是一种数据的集合表示
// 类型的本质是一种数据的集合
interface Vector1D {
x: number;
}
interface Vector2D {
x: number,
y: string
}
type SubtypeOf<T, U> = T extends U ? true : false;
type A = SubtypeOf<Vector2D, Vector1D>;// true
2、函数重载
// 函数重载签名 的几种写法
// 第一种 普通函数的重载
// 重载签名
function greet(person: string): string;
function greet(person: string[]): string[];
// 实现签名
function greet(x: unknown): unknown {
if (typeof x === 'string') {
return x;
} else if (Array.isArray(x)) {
return x;
};
throw new Error('never');
}
// 第二种 类方法的重载
class Calculator {
// 方法重载签名
add(x: number, b: number): number;
add(x: string, b: string): string;
add(x: string, b: number): string;
add(x: number, b: string): string;
// 实现签名
add(x: number | string, y: number | string) {
if (typeof x === 'string' || typeof y === 'string') {
return (<string>x).toString() + (y as string).toString();
}
return x + y
}
}
总结
边栏推荐
- 数据库期末考试,选择、判断、填空题汇总
- Kubernetes常备技能
- RecycleView和ViewPager2
- 读论文 - Unpaired Portrait Drawing Generation via Asymmetric Cycle Mapping
- [Pytorch study notes] 11. Take a subset of the Dataset and shuffle the order of the Dataset (using Subset, random_split)
- Thread handler句柄 IntentServvice handlerThread
- flink基本原理及应用场景分析
- 盘点关于发顶会顶刊论文,你需要知道写作上的这些事情!
- 【数据库和SQL学习笔记】10.(T-SQL语言)函数、存储过程、触发器
- 伪RTOS-ProroThread在CH573芯片上的移植
猜你喜欢

用GAN的方法来进行图片匹配!休斯顿大学提出用于文本图像匹配的对抗表示学习,消除模态差异!

Flink Distributed Cache 分布式缓存

华科提出首个用于伪装实例分割的一阶段框架OSFormer
![[After a 12] No record for a whole week](/img/05/df9aeb04274e308e1341020f836821.jpg)
[After a 12] No record for a whole week

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

AIDL detailed explanation

数控直流电源

ECCV2022 | RU&谷歌提出用CLIP进行zero-shot目标检测!

Flink EventTime和Watermarks案例分析

el-table,el-table-column,selection,获取多选选中的数据
随机推荐
网络信息安全运营方法论 (上)
轻松接入Azure AD+Oauth2 实现 SSO
[Pytorch study notes] 10. How to quickly create your own Dataset dataset object (inherit the Dataset class and override the corresponding method)
Flink EventTime和Watermarks案例分析
怎样在Disciples门徒获得收益?
《基于机器视觉测量系统的工业在线检测研究》论文笔记
flink部署操作-flink on yarn集群安装部署
【数据库和SQL学习笔记】10.(T-SQL语言)函数、存储过程、触发器
flink yarn-session的两种使用方式
【22李宏毅机器学习】课程大纲概述
MSRA proposes extreme masking model ExtreMA for learning instances and distributed visual representations
flink部署操作-flink standalone集群安装部署
Flink HA配置
读论文-Cycle GAN
华科提出首个用于伪装实例分割的一阶段框架OSFormer
el-pagination左右箭头替换成文字上一页和下一页
IDEA 配置连接数据库报错 Server returns invalid timezone. Need to set ‘serverTimezone‘ property.
[Database and SQL study notes] 10. (T-SQL language) functions, stored procedures, triggers
flink项目开发-flink的scala shell命令行交互模式开发
The University of Göttingen proposed CLIPSeg, a model that can perform three segmentation tasks at the same time