经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » TypeScript » 查看文章
TypeScript 学习笔记 — infer 类型推导、类型兼容 (九)
来源:cnblogs  作者:Echoyya、  时间:2023/3/14 15:41:54  对本文有异议


类型推导: inference, 使用 infer 关键字
只能用在条件类型中,用来提取类型的某一个部分的类型,放在不同的位置 就可以取不同位置的类型
ReturnType,Parameters,InstanceType,ConstructorParameters 内置的类型

1.ReturnType 返回值类型

  1. function getUser(name: string, age: number) {
  2. return { name, age, address: {} };
  3. }
  4. type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : any;
  5. type T1 = ReturnType<typeof getUser>; // 泛型需要传递类型,所以使用 typeof

2.Parameters 参数类型

  1. type Parameters<T extends (...args: any) => any> = T extends (...args: infer P) => any ? P : never;
  2. type T2 = Parameters<typeof getUser>;

3.InstanceType 实例类型

  1. class Person {
  2. constructor() {
  3. return { a: 1, b: 2 };
  4. }
  5. } // Person的实例类型是什么? Person
  6. type InstanceType<T extends new (...args: any[]) => any> = T extends { new (...args: any[]): infer I } ? I : never;
  7. type T3 = InstanceType<typeof Person>; // 内置的
  8. type T4 = Person;

4.ConstructorParameters 构造函数参数类型

  1. class Person {
  2. constructor() {
  3. return { a: 1, b: 2 };
  4. }
  5. }
  6. type ConstructorParameters<T extends new (...args: any[]) => any> = T extends new (...args: infer P) => any ? P : never;
  7. type T5 = ConstructorParameters<typeof Person>;

5.infer 实践

``

更改元组类型

  1. type TailToHead<T extends any[]> = T extends [...infer C, infer B] ? [B, ...C] : any;
  2. 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)[]

  1. // 写法二: 由写法一演变而来 infer R
  2. type ElementOf<T> = T extends Array<infer R> ? R : any;
  3. type TupleToUnion = ElementOf<[string, number, boolean]>; // 返回联合类型 string | number | boolean

获取 Promise 返回值类型(递归)

  1. type PromiseV<T> = T extends Promise<infer V> ? PromiseV<V> : T;
  2. type PromiseReturnValue = PromiseV<Promise<number>>; // number
  3. type PromiseReturnValue2 = PromiseV<Promise<Promise<string>>>; // string

原文链接:https://www.cnblogs.com/echoyya/p/17189296.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号