这次是真的学会infer了

手写个infer,看了很简单的。


type myInfer<T> = T extends string ? string : T extends number ? number : T extends boolean ? boolean : never;

类型太多了,这里就举例string,number,boolean这几种类型,效果是一样的,结果都是返回入参的数据类型,类似于typeof,它和typeof,各种数据类型是属于同一级别的方法

1.这里去推导函数的入参的返回类型,下面的这里例子是瞎写的主要是识别他的作用,符合条件就返回推导出来的类型,不符合就返回ppp

type A = ppp
type ParamType<T> = T extends (arg: infer R) => any ? R : A;
type s = ParamType<string>;  // ppp
type n = ParamType<(id: number) => void>;  // number
type o = ParamType<{ id: number }>;    //ppp

type ElementOf<T> = T extends Array<infer E> ? E : T;

这个才是真正使用的时候会写的代码

interface Customer {
  name: string
  moneyPaid: number
}
// 定义了一个函数类型,接受一个Customer类型的参数并返回一个字符串
type custFuncType = (cust: Customer) => string
// 定义了一个泛型类型inferType<T>,这是理解的重点。这是一个条件类型,它使用了infer关键字
type inferType<T> = T extends (params: infer P) => any ? P : T
// 定义了inferResultType类型别名,它是通过将前面定义的custFuncType类型作为参数传递给inferType得到的
type inferResultType = inferType<custFuncType>

2.这里推导数组里某个值的数据类型

type ElementOf<T> = T extends Array<infer E> ? E : T;
interface User {
  id: number;
  name: string;
}
type Tuple = User[];
type TupleToUnion = ElementOf<Tuple>

这个是推导函数返回值类型的工具函数

type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any;

// type n = number
type n = ReturnType<() => number>;

// type s = string
type s = ReturnType<() => string>;

这是推导出联合类型的

type Foo<T> = T extends { a: infer U, b: infer U } ? U : never;
type T10 = Foo<{ a: string, b: string }>;  // string
type T11 = Foo<{ a: string, b: number }>;  // string | number

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每天吃饭的羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值