在TypeScript中,interface
和辅助类型(如 Partial
、Readonly
等)都是用来定义类型的工具,但它们的使用场景和目的有所不同。interface
主要用于定义对象的形状,而辅助类型则用于对现有类型进行转换或扩展。
Interface(接口):
辅助类型(Utility Types):
Partial<T>
、Readonly<T>
、Pick<T, K>
等。interface
重写辅助类型在某些情况下,可以使用 interface
来模拟辅助类型的行为,但通常这不是最佳实践。辅助类型提供了更简洁和灵活的方式来处理类型转换。
interface
模拟 Partial<T>
假设我们有一个 User
接口:
interface User {
name: string;
age: number;
}
我们想要创建一个类型,其中所有属性都是可选的。使用 Partial<T>
:
type PartialUser = Partial<User>;
使用 interface
模拟:
interface PartialUser {
name?: string;
age?: number;
}
优势:
类型:
Partial<T>
:将所有属性变为可选。Readonly<T>
:将所有属性变为只读。Pick<T, K>
:从类型 T
中选取部分属性 K
。Omit<T, K>
:从类型 T
中排除部分属性 K
。应用场景:
Partial<T>
来处理部分提交的表单数据。Readonly<T>
来确保状态对象不被意外修改。Pick<T, K>
来提取 API 响应中需要的部分数据。问题:为什么使用辅助类型比直接使用 interface
更好?
原因:
解决方法:
type
关键字来定义。// 使用内置辅助类型
type PartialUser = Partial<User>;
// 自定义辅助类型
type NonNullableUser = {
[K in keyof User]-?: NonNullable<User[K]>;
};
// 使用自定义辅助类型
const nonNullableUser: NonNullableUser = {
name: "John",
age: 30,
};
通过这种方式,可以充分利用 TypeScript 的类型系统,提高代码的可维护性和健壮性。
领取专属 10元无门槛券
手把手带您无忧上云