前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >原来TypeScript已经有这么多工具函数了?附手动实现!

原来TypeScript已经有这么多工具函数了?附手动实现!

作者头像
萌萌哒草头将军
发布2025-02-19 11:09:16
发布2025-02-19 11:09:16
4800
代码可运行
举报
文章被收录于专栏:前端框架
运行总次数:0
代码可运行

起因

之前提到过,我面试字节,面试官问了很多关于ts的问题,例如:

  • ts里有哪些工具函数?
  • 怎么实现ts里的Partial工具函数?
  • ts里的装饰器了解吗?

当时面试听到第二个问题我直接懵逼了。本来用到的就少,更别说自己实现了。

现在有充足的时间了,好好整理了下这些工具函数,并且逐个实现了一遍,希望可以帮到你。

原来已经有这么多工具函数了

我根据发布的版本整理了下,可以说是非常非常强大了,包含了我们开发中几乎可能遇到的所有情况。

引入版本2.1

工具类型

描述

Partial<T>

将属性设为可选

Readonly<T>

将属性设为只读

Record<K, T>

构造键值对类型

Pick<T, K>

从类型中挑选属性

Exclude<T, U>

剔除某些类型

引入版本2.8

工具类型

描述

Extract<T, U>

提取符合条件的类型

NonNullable<T>

剔除 null 和 undefined

ReturnType<T>

获取函数返回值类型

InstanceType<T>

获取构造函数的实例类型

引入版本3.5

工具类型

描述

Omit<T, K>

从类型中删除属性

引入版本4.0

工具类型

描述

Awaited<T>

获取 Promise 的解析类型

引入版本4.4

工具类型

描述

Required<T>

将属性设为必填

引入版本4.6

工具类型

描述

Parameters<T>

获取函数的参数类型

ConstructorParameters<T>

获取构造函数的参数类型

手动实现

下面几个是基础的实现。

1. Partial<T>

将类型 T 的所有属性变为可选。

代码语言:javascript
代码运行次数:0
复制
type Partial<T> = {
  [P in keyof T]?: T[P];
};

2. Required<T>

将类型 T 的所有属性变为必选。

代码语言:javascript
代码运行次数:0
复制
type Required<T> = {
  [P in keyof T]-?: T[P];
};

这里的-?是移除属性修饰符中的?,将可选属性变为必选属性

3. Readonly<T>

将类型 T 的所有属性设为只读。

代码语言:javascript
代码运行次数:0
复制
type Readonly<T> = {
  readonly [P in keyof T]: T[P];
};

4. Record<K, T>

创建一个类型,其属性名为 K,属性值为 T。

代码语言:javascript
代码运行次数:0
复制
type Record<K extends keyof any, T> = {
  [P in K]: T;
};

5. Pick<T, K>

从类型 T 中选择部分属性 K。

代码语言:javascript
代码运行次数:0
复制
type Pick<T, K extends keyof T> = {
  [P in K]: T[P];
};

6. Exclude<T, U>

从类型 T 中排除可以赋值给类型 U 的类型。

代码语言:javascript
代码运行次数:0
复制
type Exclude<T, U> = T extends U ? never : T;

7. Omit<T, K>

从类型 T 中剔除部分属性 K。

代码语言:javascript
代码运行次数:0
复制
type Omit<T, K extends keyof any>
= Pick<T, Exclude<keyof T, K>>;

8. Extract<T, U>

从类型 T 中提取可以赋值给类型 U 的类型。

代码语言:javascript
代码运行次数:0
复制
type Extract<T, U> = T extends U ? T : never;

9. NonNullable<T>

从类型 T 中排除 null 和 undefined。

代码语言:javascript
代码运行次数:0
复制
type NonNullable<T>
= T extends null | undefined ? never : T;

10. ReturnType<T>

获取函数类型 T 的返回类型。

代码语言:javascript
代码运行次数:0
复制
type ReturnType<T extends (...args: any) => any>
= T extends (...args: any)
=> infer R ? R : any;

inferts的关键字,一般很少用到,主要用于条件类型中,用来推断一个类型的某些部分。相信上面的例子可以让你更好的理解它的用处。

11. ConstructorParameters<T>

获取构造函数类型 T 的参数类型组成的元组类型。

下面的几个类型实现就比较困难了,我也是查询好多资料才搞明白(?半懂)的

代码语言:javascript
代码运行次数:0
复制
type ConstructorParameters<T extends abstract new (...args: any) => any>
= T extends abstract new (...args: infer P)
=> any ? P : never;

12. Parameters<T>

获取函数类型 T 的参数类型组成的元组类型。

代码语言:javascript
代码运行次数:0
复制
type Parameters<T extends (...args: any) => any>
= T extends (...args: infer P)
=> any ? P : never;

13. InstanceType<T>

获取构造函数类型 T 的实例类型。

代码语言:javascript
代码运行次数:0
复制
type InstanceType<T extends abstract new (...args: any) => any> 
  = T extends abstract new (...args: any)
  => infer R ? R : any;

14. ThisType<T>

标记对象字面量的 this 类型。

代码语言:javascript
代码运行次数:0
复制
type ThisTypeLike<T> = {
  [K in keyof T]: T[K] extends (...args: any[]) => any
    ? (this: T, ...args: Parameters<T[K]>) => ReturnType<T[K]>
    : T[K];
};

总结

好了,今天的分享就这些了,希望可以帮助大家更好的理解ts的这些工具函数。整理不易,如果对你有用请给我点赞,十分感谢!

如果文章中有错误的地方请及时指正!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-11-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 萌萌哒草头将军 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 起因
  • 原来已经有这么多工具函数了
    • 引入版本2.1
    • 引入版本2.8
    • 引入版本3.5
    • 引入版本4.0
    • 引入版本4.4
    • 引入版本4.6
  • 手动实现
    • 1. Partial<T>
    • 2. Required<T>
    • 3. Readonly<T>
    • 4. Record<K, T>
    • 5. Pick<T, K>
    • 6. Exclude<T, U>
    • 7. Omit<T, K>
    • 8. Extract<T, U>
    • 9. NonNullable<T>
    • 10. ReturnType<T>
    • 11. ConstructorParameters<T>
    • 12. Parameters<T>
    • 13. InstanceType<T>
    • 14. ThisType<T>
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档