首页 > 其他分享 >TypeScript 学习笔记 — infer 类型推导、类型兼容 (九)

TypeScript 学习笔记 — infer 类型推导、类型兼容 (九)

时间:2023-03-14 15:45:28浏览次数:57  
标签:... TypeScript any extends 类型 type 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,any,extends,类型,type,infer
From: https://www.cnblogs.com/echoyya/p/17189296.html

相关文章

  • http请求Content-Type类型和传参方式
    引言在做接口测试、性能测试的时候,调用接口时需要知道Content-Type类型,不然调用接口异常,可能需要花不少时间进行排查。在一些时候,没有接口文档,或者接口文档没有说明Conte......
  • TypeScript实例_手动编译与自动编译、类型注解、接口和类的详解
    一.认识TypeScriptTypeScript是一种由微软开发的开源、跨平台的编程语言。它是JavaScript的超集,最终会被编译为JavaScript代码。2012年10月,微软发布了首个公开版......
  • C语言中的数据类型
    1、整型(1)short短整型(内存中占2个字节)是shortint的简写。取值范围:-32768~+32767(2Bytes)。(2)int整形(int)(内存中占4字节)取值范围:-2147483648~+2147483647(4......
  • oracle nvl,nvl2, nullif,以及类型强转函数cast
     参考博客 https://www.cnblogs.com/xielong/p/9285147.html SELECT0ASt1,1ASt2,1.123456ASt3,NULLASt4,round((1234.123456-null)*100/nvl(0.1,......
  • 如何打印数值类型
    问题如题目,在最近的工作中,使用cppcheck对代码进行静态检查,遇到打印size_t类型以及其他类型的警告,再这里记录下。本文提到的打印输出,指的是printf函数或者Format函......
  • [React][typescript]官方教程小游戏Tic-Tac-Toe
    本文记录一些跟随官方教程后的心得,按照最终版本代码逐块进行理解,包括typescript和react的一些基本操作和误区函数组件Game:最后输出的大组件,所有组件的父类Board:Game......
  • HUSTOJ后台公告KindEditor编辑器中文件上传类型限制修改
    1.进入Ubuntu系统,/home/judge/src/web目录2.搜索找到KindEditor文件夹3.进入PHP文件夹,打开upload_json.php4.按照提示找到限制上传文件类型的代码,添加相应文件扩展名即......
  • Linux操作系统file命令 – 识别文件类型
    前言file命令用来识别文件类型,也可用来辨别一些文件的编码格式。(是通过查看文件的头部信息来获取文件类型,而不是像Windows通过扩展名来确定文件类型的)语法file[参数]......
  • 工程化引用数据的几个类型总结
    基本数据类型有string,number,Boolean,undefined,null和es6新增的symbol和bingint。引用数据类型有数组、对象、字符串。在es6新增的还有set、map、weakset、weakmap。symbol创......
  • Java基础知识点(集合、ArrayList集合、基本数据类型对应的包装类及
    1.为什么要有集合?集合它可以自动扩容。2.集合存储数据类型的特点:不能直接存基本数据类型,需要将其变为包装类再存入,可以存引用数据类型。二:集合和数组的对比长度:数组的长度固......