类型推导: 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

最新文章

  1. Android Studio2.1.2 Java8环境下引用Java Library编译出错
  2. search-a-2d-matrix(二维矩阵查找)
  3. [USACO2004][poj1985]Cow Marathon(2次bfs求树的直径)
  4. 起点CG原创教程——digicel.FlipBook.6教程
  5. PHP操作数据库类
  6. SQL Server 2008 R2评估期已过的解决办法
  7. iOS-开发日志-UITextView介绍
  8. javascript中对象的不同创建方法
  9. STM32F407的串口采用DMA收发数据
  10. IOS开发之记录用户登陆状态,ios开发用户登陆
  11. 内存与IO的交换【转】
  12. springboot中访问jsp文件方式
  13. MYSQL 单表一对多查询,将多条记录合并成一条记录
  14. windows 中java开发环境搭建
  15. 『转载』Matlab中fmincon函数获取乘子
  16. Service的启动,绑定,绑定后通信,跨应用绑定,跨应用绑定后通信
  17. [Android] 状态栏的一些认识
  18. CF1110C Meaningless Operations(构造题)
  19. Linux下可以使用ps命令来查看Oracle相关的进程
  20. SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase, Hana]

热门文章

  1. Storm日志预警以及汇总解决方案
  2. 本地jar包怎么导入到maven仓库中?
  3. Day09-参数+递归
  4. std::unique_ptr release的使用
  5. 2.21(html)
  6. Linux_Shell脚本
  7. HashMap中的Entry接口
  8. 1012.Django中间件以及上下文处理器
  9. 使用python制作nRF52832升级包和合成烧录文件的经验(nRF52832 DFU经验分享)
  10. vuw3学习大全(2)