一文读懂TypeScript泛型工具类型-Required<T>

1. 定义

在 TypeScript 中,泛型工具类型 Required<T> 主要用于将类型T中的所有属性变为必选属性

和泛型工具类型 Partial<T> 相反,Partial<T>是将类型 T 中的所有属性变为可选属性

2. 源码

typescript 复制代码
type Required<T> = {
  [P in keyof T]-?: T[P];
};

实现原理:

  • 上面这段代码中,使用 type 关键字来定义 Required<T> 类型,它接收一个类型参数 T。
  • 然后,使用映射类型的语法 { [P in keyof T]-? } 来创建一个新的类型,这里的 keyof T 表示的是:获取类型 T 的所有属性名组成的联合类型。[P in keyof T] 表示的是:遍历 K 中的每个键,并将其作为属性名,T[P] 表示的是:获取 T 中每个键对应的类型。
  • 最后在属性名后的 ? 前加上 -,表示去掉所有可选参数状态,将属性变为必选属性。

下面我们先看下 Required<T> 的基本用法:

typescript 复制代码
type Person = {
  name?: string;
  age?: number;
}

type RequiredPerson = Required<Person>;

上面这段代码中,我们定义了一个类型 Person,它包含了可选属性 name 和 age。通过将 Person 传递给Required<T>,我们得到了新的类型 RequiredPerson,它将 Person 类型中的所有属性都变为必选属性。

使用 Required<Person> 创建的新类型 RequiredPerson,等同于下面的这段代码:

typescript 复制代码
type RequiredPerson = {
  name: string;
  age: number;
}

那么在新类型 RequiredPerson 中,我们就需要给 name 和 age 提供有效的值。

typescript 复制代码
const person: RequiredPerson = {
  name: "Echo",
  age: 26
}

新类型中,属性的类型要与原始对象的属性类型一致,下面这种情况会报错:

3. 使用场景

3.1. 表单验证

当你需要对表单数据进行验证时,可以使用 Required<T> 来确保所有必填字段都是有效的。

typescript 复制代码
interface LoginForm {
  username?: string;
  password?: string;
}

function validateLoginForm(loginForm: Required<LoginForm>): void {
  // 在这里对表单进行验证,确保必需字段都存在有效值
  if (!loginForm.username) {
    console.log("请填写用户名");
  } else if (!loginForm.password) {
    console.log("请填写密码");
  } else {
    console.log("表单验证通过");
  }
}

// 调用 validateLoginForm
validateLoginForm({
  username: "Echo",
  password: "admin123",
});

3.2. API 请求和响应

在发送 API 请求或解析响应数据时,你可以使用 Required<T> 来指定所需的属性,并确保响应数据包含了这些属性。

typescript 复制代码
interface APIResponse {
  data?: {
    id?: number;
    name?: string;
    email?: string;
  };
  code?: number;
  message?: string;
}

// 使用 Required<T> 来指定 API 响应中必需的字段
type RequiredAPIResponse = Required<APIResponse>;

// 模拟 API 请求返回的数据
const responseData: RequiredAPIResponse = {
  data: {
    id: 1,
    name: "Echo",
    email: "[email protected]",
  },
  code: 0,
  message: "OK",
};

// 使用 API 响应对象
if (responseData.code !== 0) {
  console.log("API 请求失败");
} else {
  console.log("API 请求成功", responseData.data);
}

4. 注意事项

需要注意的是:Required<T> 只能应用于对象类型,而不能应用于基本类型。

总结

以上就是我对 TypeScript 中泛型工具类型 Required<T> 的了解,如果有不正确的地方,欢迎大家在评论区多多指正!

看完记得点个赞哦~ 谢谢!🤞🤞🤞

相关推荐
weixin_4738947720 分钟前
前端服务器部署分类总结
前端·网络·性能优化
LuckyLay37 分钟前
React百日学习计划-Grok3
前端·学习·react.js
澄江静如练_42 分钟前
小程序 存存上下滑动的页面
前端·javascript·vue.js
互联网搬砖老肖1 小时前
Web 架构之会话保持深度解析
前端·架构
菜鸟una1 小时前
【taro3 + vue3 + webpack4】在微信小程序中的请求封装及使用
前端·vue.js·微信小程序·小程序·typescript·taro
hao_04131 小时前
elpis-core: 基于 Koa 实现 web 服务引擎架构设计解析
前端
狂野小青年2 小时前
npm 报错 gyp verb `which` failed Error: not found: python2 解决方案
前端·npm·node.js
鲁鲁5172 小时前
Windows 环境下安装 Node 和 npm
前端·npm·node.js
跑调却靠谱2 小时前
elementUI调整滚动条高度后与固定列冲突问题解决
前端·vue.js·elementui
呵呵哒( ̄▽ ̄)"3 小时前
React - 编写选择礼物组件
前端·javascript·react.js