likes
comments
collection
share

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

作者站长头像
站长
· 阅读数 57

1. 定义

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

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

2. 源码

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> 的基本用法:

type Person = {
  name?: string;
  age?: number;
}

type RequiredPerson = Required<Person>;

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

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

type RequiredPerson = {
  name: string;
  age: number;
}

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

const person: RequiredPerson = {
  name: "Echo",
  age: 26
}

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

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

3. 使用场景

3.1. 表单验证

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

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> 来指定所需的属性,并确保响应数据包含了这些属性。

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: "echo123@test.com",
  },
  code: 0,
  message: "OK",
};

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

4. 注意事项

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

总结

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

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

转载自:https://juejin.cn/post/7289277654799810600
评论
请登录