type-challenges类型体操15题(一)

本文介绍了TypeScript中的各种高级类型工具,如Pick、Readonly、TupleToObject等,以及如何通过这些工具进行类型判断、数组操作和Promise处理,帮助读者提升对类型编程的理解和实践能力。
摘要由CSDN通过智能技术生成

前言

这个专栏会持续更新,github上的type-challenges,每次15道题,通过练习让你掌握类型编程.

Hello World

image.png

type HelloWorld = string

Equal判断HelloWorld和string类型是否相等;Expect判断类型是否为true,如果为true就返回true否则抛出一个错误

Pick

image.png

type MyPick<T extends object, K extends keyof T> = {
  [P in K]: T[P]
}

Pick是TS内部已经实现了的一个工具类型,泛型T被约束为是一个对象,泛型K被约束为T的键(keyof T 表示获取T的所有键),Pick返回的是一个新的对象类型,对象的键P被映射在K上,对象的值是原对象T的P键的值.

Readonly

image.png

type MyReadonly<T extends object> = {
  readonly [K in keyof T]: T[K]
}

Readonly也是TS内部已经实现了的工具类型,Readonly接受一个泛型T被约束为是一个object,返回的是一个新对象类型,对象的键K映射为T对象的键,并给键加上readonly修饰符,值就是T对象上K键对象的值.

TupleToObject

image.png

type TupleToObject<T extends readonly (string | number | symbol)[]> = {
  [K in T[number]]: K
}

TupleToObject类型工具接受一个泛型T被约束为元素类型是string,number,symbol类型的z只读数组,返回一个对象,对象的键是数组T中的元素(T[number] 表示获取T中的元素),值和键一致.

First

image.png

type First<T extends any[]> = 
T extends [infer F, ...args: any] ? F : never

First类型工具接收一个泛型T被约束为是任何数组,如果T是[infer F, …args: any]数组的子集(infer F,infer 表示推导一个类型,这里是推导第一个类型为F,…args 剩余参数可以是任意类型,这里用不到),就返回F,不是就返回never(never 表示永不可达的情况,一般用作边界逃出).

Length

image.png

type Length<T extends readonly any[]> = T['length']

Length工具类型接受一个泛型T被约束为元素是任何类型的只读数组,返回的是T的长度(T[‘lebgth’] 表示泛型T数组的长度).

Exclude

image.png

type MyExclude<T, U> = T extends U ? never : T

Exclude工具类型接受两个泛型T和U,如果T中有U就剔除,没有就保留T.

Awaited

image.png

type MyAwaited<T extends Promise<unknown> | { then: unknown }> =
T extends Promise<infer U>
? U extends Promise<unknown>
  ? MyAwaited<U>
  : U
: T extends { then: (onfulfilled: (arg: infer A) => any) => any }
  ? A
  : never

Awaited工具类型接受一个泛型T被约束为是一个Promise<unknown对象(表示暂时不知道这个Promise的返回类型是啥,但是在未来它一定是有值的)或者是一个then对象,如果T是Promise<infer U的子集,就在判断这个推断出来的U是否是一个嵌套的Promise,如果是就递归调用Awaited类型工具并传入U,如果返回值不是一个Promise就返回U;再退出来判断T是不是一个then对象如果是就返回推断出来的infer A参数类型,如果不是就返回never.

If

image.png

type If<C extends boolean, T, F> = C extends true ? T : F

类型工具If接受三个泛型C被约束为一个布尔,T和F,返回的是如果C是true就返回T,否则就返回F.

Concat

image.png

type Concat<T extends readonly any[], U extends readonly any[]> = [...T, ...U]

Concat类型工具接受两个泛型,T和U都被约束为元素可以是任意类型的只读数组,返回的是一个数组,并在内部展开T和U.

Includes

image.png

type Includes<T extends readonly any[], U> =
U extends T[number] ? true : false

Includes工具类型接收两个泛型,T被约束为元素是任意类型的只读数组,如果U存在于T的元素中就返回true否则返回false.

Push

image.png

type Push<T extends any[], U> = [...T, U]

Push工具类型接收两个泛型,T被约束为是一个任意类型的数组,U是要添加的元素,返回的是一个数组展开T,追加U.

Unshift

image.png

type Unshift<T extends any[], U> = [U, ...T]

Unshift工具类型接收两个泛型,T被约束为是一个任意类型的数组,U是要添加的元素,返回的是一个数组展开T,追加U.

Parameters

image.png

type MyParameters<T extends (...args: any[]) => any> =
T extends (...args: infer A) => any ? A : never

Parameters工具函数接收一个泛型T被约束为一个任意函数,如果T是任意函数,就返回推断出来的参数类型A,否则返回never.

ReturnType

image.png

type MyReturnType<T extends (...args: any[]) => any> =
T extends (...args: any[]) => R ? R : never

ReturnType工具函数接收一个泛型T被约束为一个任意函数,如果T是任意函数,就返回推断出来的返回类型R,否则返回never.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值