TypeScript 学习笔记 — infer 类型推导、类型兼容 (九)
类型推导: inference, 使用 infer 关键字
只能用在条件类型中,用来提取类型的某一个部分的类型,放在不同的位置 就可以取不同位置的类型
ReturnType,Parameters,InstanceType,ConstructorParameters 内置的类型
1.ReturnType 返回值类型
function getUser(name: string, age: number) {
return { name, age, address: {} };
}
type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : any;
type T1 = ReturnType<typeof getUser>; // 泛型需要传递类型,所以使用 typeof
2.Parameters 参数类型
type Parameters<T extends (...args: any) => any> = T extends (...args: infer P) => any ? P : never;
type T2 = Parameters<typeof getUser>;
3.InstanceType 实例类型
class Person {
constructor() {
return { a: 1, b: 2 };
}
} // Person的实例类型是什么? Person
type InstanceType<T extends new (...args: any[]) => any> = T extends { new (...args: any[]): infer I } ? I : never;
type T3 = InstanceType<typeof Person>; // 内置的
type T4 = Person;
4.ConstructorParameters 构造函数参数类型
class Person {
constructor() {
return { a: 1, b: 2 };
}
}
type ConstructorParameters<T extends new (...args: any[]) => any> = T extends new (...args: infer P) => any ? P : never;
type T5 = ConstructorParameters<typeof Person>;
5.infer 实践
``
更改元组类型
type TailToHead<T extends any[]> = T extends [...infer C, infer B] ? [B, ...C] : any;
type x = TailToHead<["Echoyya", 30, 40, 50, "beijing"]>; // ["beijing","Echoyya",30,40,50]
将元组转换成联合类型
写法一:类型单一时,可返回正确类型,元组类型时,不好判断 暂返回 字符串 "R" 进行验证
type ElementOf<T> = T extends Array<string | number | boolean> ? "R" : any; // (string|number|boolean)[]
// 写法二: 由写法一演变而来 infer R
type ElementOf<T> = T extends Array<infer R> ? R : any;
type TupleToUnion = ElementOf<[string, number, boolean]>; // 返回联合类型 string | number | boolean
获取 Promise 返回值类型(递归)
type PromiseV<T> = T extends Promise<infer V> ? PromiseV<V> : T;
type PromiseReturnValue = PromiseV<Promise<number>>; // number
type PromiseReturnValue2 = PromiseV<Promise<Promise<string>>>; // string
TypeScript 学习笔记 — infer 类型推导、类型兼容 (九)的更多相关文章
- TypeScript 学习笔记 — 函数中的类型(四)
目录 函数的两种声明方式 可选参数 默认参数 剩余参数 函数的重载 this 的类型 对于函数主要关心的是:函数的入参类型 和 函数的返回值类型 函数的两种声明方式 通过 function 关键字来进 ...
- javascript学习笔记(四) Number 数字类型
数字格式化方法toFixed().toExponential().toPrecision(),三个方法都四舍五入 toFixed() 方法指定小数位个数 toExponential() 方法 用科学 ...
- Typescript 学习笔记三:函数
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- Typescript 学习笔记七:泛型
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- Typescript 学习笔记六:接口
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- Typescript 学习笔记五:类
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- Typescript 学习笔记二:数据类型
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- Typescript 学习笔记一:介绍、安装、编译
前言 整理了一下 Typescript 的学习笔记,方便后期遗忘某个知识点的时候,快速回忆. 为了避免凌乱,用 gitbook 结合 marketdown 整理的. github地址是:ts-gitb ...
- Typescript 学习笔记四:回忆ES5 中的类
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- TypeScript学习笔记(八):1.5版本之后的模块和命名空间
我之前有写过TS1.5版本之前的“模块”的笔记:TypeScript学习笔记(七):模块 但是TS这里的模块和在ECMAScript 2015里的模块(即JS原生支持了模块的概念)概率出现了混淆,所以 ...
随机推荐
- varchar(1)占用几个字节
在version4之前,MySQL中varchar长度是按字节:而version5之后,按字符.如varchar(6),在version4,表示占用6个字节,而在version5中,表示占用6个字符. ...
- js-3part-Javascript使用Ajax
getElementsByName使用方法如下是input标签,我们尝试从里面获取到csrf的value值. 这个csrf标签,是隐藏的,在浏览器页面element可以看到,在html源码里面,是看不 ...
- Jmeter的简单配置和使用
对于测试大佬来说,最常见的压测工具莫过于Apache旗下的 JMeter . 那么测试大佬经常使用,对于我们后端开发者来说,也是属于必备的一个技能. 接下来咱们就一起简单的配置一下烫手的jmeter ...
- python 操作MongoDB pymongo
python操作MongoDB 1.安装pymongo pip install pymongo 2.连接数据库 启动mongodb服务: 包含mongod.exe文件夹bin :shift+鼠标右键, ...
- 【Hive】数据倾斜原因及解决方法汇总
1)数据倾斜根本原因:由于数据分布不均匀,导致map端读取的数据分布不均匀(数据长尾分布),从而使得map处理的数据量差异过大. (2)解决思路:Hive是分阶段执行的,map处理数据量的差异取决于上 ...
- C#函数编程学习
知识补缺 //用Func委托写简单函数 Func<int,int> add = i => i + 1; //定义一个只读属性 public class Tea { public Te ...
- 记录Echarts官网打开慢的解决方法
进入C:\Windows\System32\drivers\etc: 在hosts文件里添加 151.101.2.132 echarts.apache.org
- 关于在Eclipse中使用EclEmma
在LAB2中,要求使用EclEmma来统计JUnit测试用例的代码覆盖度.下面就来说说如何进行基本的使用来应付实验(bushi). 在这给出完全体,可以访问下面的网址进行学习. http://www. ...
- vue3.0+vite按需引入element plus
1.安装vite-plugin-style-import yarn add vite-plugin-style-import -D 2.在项目根目录下的vite.config.js中配置 import ...
- Shell 更多结构化命令(流程控制)
更多的结构化命令 上一章里,你看到了如何通过检查命令的输出和变量的值来改变 shell 脚本程序的流程.本章会继续介绍能够控制 shell 脚本流程的结构化命令.你会了解如何重复一些过程和命令,也就是 ...