手写常见的typescript类型

1.Pick

type myPick<T,K extends keyof T> = { [key in K]:T[key] }

2.Readonly

type myReadonly<T> = {
    readonly [key in keyof T]:T[key]
}

3.Tuple to Object

const tuple = ['a','b','c']

type TupleToObject<T extends readonly PropertyKey[]> = {
    [P in T[number]] : P
} 

type resTuple = TupleToObject<typeof tuple> // 为{'a':'a','b':'b','c':'c'}


4.First Of Array

type First<T extends any[]> = T extends [] ? never : T[0]

5.Length of Tuple

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

6.Exclude

// 运用extends的第二个用法,即 Distributive Conditional Types.
// T extends U 会分发性的把T的每个项去判断是否等于'a'
// https://www.typescriptlang.org/docs/handbook/2/conditional-types.html#distributive-conditional-types
// 按官网的例子而言,我们假如需要一个string和number组合而成的数组类型,即(string | number)[]
// 写成type ToArray<Type> = Type extends any ? Type[] : never 导致 string[] | number[],由于Distributive Conditional Types的特性
//因此需要拿[]包裹,即type ToArray<Type> = [Type] extends [any] ? Type[] : never
type MyExclude<T,U> = T extends U ? never : T
type Result = MyExclude<'a' | 'b' | 'c', 'a'> // 'b' | 'c'

6.PickPartial

// 开发者在泛型里输入两个参数,interface和某个值并把它置为可选
interface User {
    id: number;
    age: number;
    name: string;
};

type PickPartial<T,K extends keyof T> = Partial<Pick<T, K>> & Omit<T,K>
type Result = PickPartial<User, 'id'>
// {
//     id?: number;
//     age: number;
//     name: string;
// }

7.Awaited

// type ExampleType = Promise<string>

// type Result = MyAwaited<ExampleType> // string

type MyAwaited<T extends PromiseLike<any | PromiseLike<any>>> = T extends PromiseLike<infer P> ?
    P extends PromiseLike<any> ? MyAwaited<P> : P : never 

8.If

type MyIf<F extends boolean,T ,K> = F extends true ? T : F extends boolean ? K : never 

9.Concat

// For example:
// type Result = Concat<[1], [2]> 
// expected to be [1, 2]
type MyConcat<T extends readonly unknown[],K extends readonly unknown[]> = [...T,...K]

10.Includes

type MyIncludes<T extends any[],K> = { 
    [key in T]:T[key]
}[K] extends true ? true : false

11.Push

// type Result = Push<[1, 2], '3'> // [1, 2, '3']
type MyPush<T extends readonly unknown[],U> = [...T,U]

12.Unshift

// type Result = Push<[1, 2], '3'> // [1, 2, '3']
type MyPush<T extends readonly unknown[],U> = [U,...T]

13.Parameters

// const foo = (arg1: string, arg2: number): void => {}

// type FunctionParamsType = MyParameters<typeof foo> // [arg1: string, arg2: number]

type MyParameters<T extends (...args:any[]) => unknown> = T extends (...args:infer S) => unknown ? S : never
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 实现一个数组去重的函数 思路:使用对象来存储数组中的元素,遍历数组,若元素在对象中不存在,则存储到对象中,并将其推入新数组中。 2. 实现一个函数,判断一个字符串是否是回文字符串 思路:将字符串翻转,与原字符串比较是否相等。 3. 实现一个函数,可以将多维数组转化为一维数组 思路:使用递归来遍历多维数组,将每个元素推入新数组中,直到遍历完所有元素。 4. 实现一个函数,统计一个字符串中出现次数最多的字符 思路:使用对象来存储每个字符出现的次数,遍历字符串,将每个字符存储到对象中,找到出现次数最多的字符。 5. 实现一个函数,实现数组的冒泡排序 思路:使用双重循环遍历数组,比较相邻两个元素的大小,如果前者大于后者,则交换两个元素的位置,直到遍历完数组。 6. 实现一个函数,实现数组的快速排序 思路:选择数组中的一个元素作为基准点,将数组分为两个部分,一部分大于基准点,一部分小于基准点,递归处理两个部分。 7. 实现一个函数,实现数组的深拷贝 思路:使用递归遍历数组中的每个元素,判断元素类型,如果是对象或数组,则进行深拷贝,如果是基本类型,则直接复制。 8. 实现一个函数,实现函数的柯里化 思路:使用闭包保存参数,当参数个数达到预设值时,执行函数。 9. 实现一个函数,实现函数的节流 思路:使用定时器来控制函数执行的频率,每次函数执行时,清除定时器并重新设置一个定时器。 10. 实现一个函数,实现函数的防抖 思路:使用定时器来延迟函数执行,每次函数执行时,清除定时器并重新设置一个定时器。如果在定时器延迟时间内再次触发函数,则重新计时。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值