- 只包含
id
、name
和 price
字段的类型:
interface FullProduct {
id: string;
name: string;
description: string;
price: number;
category: string;
}
type ProductSummary = Pick<FullProduct, 'id' | 'name' | 'price'>;
- 除了
category
字段之外的其他所有字段的类型:
type ProductWithoutCategory = Omit<FullProduct, 'category'>;
Pick、Omit 和 Exclude 泛型工具类型的相互关系和注意事项
- 相互关系:
Pick<T, K>
:从类型 T
中选择一组属性 K
来构造新类型。
Omit<T, K>
:从类型 T
中移除一组属性 K
来构造新类型。可以认为 Omit<T, K>
等价于 Pick<T, Exclude<keyof T, K>>
,Exclude
在这里先计算出要移除属性后的剩余属性。
Exclude<T, U>
:从联合类型 T
中排除所有可分配给 U
的类型,返回一个新的联合类型。在 Omit
实现中,Exclude<keyof T, K>
就是计算出 T
类型中除去 K
这组属性名后的其他属性名。
- 注意事项:
- 属性名类型:
Pick
和 Omit
的第二个参数必须是类型 T
中属性名的联合类型。如果传入不存在的属性名,TypeScript 会在编译时报错。例如,Pick<FullProduct, 'nonExistentProperty'>
会报错。
- 类型兼容性:使用这些工具类型构造出的新类型与原类型是不同的类型,尽管它们可能部分属性相同。在进行类型赋值和函数参数传递时,要确保类型兼容性。例如,一个函数接受
FullProduct
类型参数,传入 ProductSummary
类型参数会报错,因为 ProductSummary
缺少 FullProduct
中的一些属性。
- 复杂类型嵌套:当原类型
T
中存在复杂类型嵌套时,这些工具类型只作用于最外层属性。如果需要对嵌套类型内部属性进行操作,可能需要递归地使用这些工具类型或者自定义泛型来处理。