TypeScript 的 Pick
类型辅助工具用于从一个类型中选择特定的属性,从而创建一个新类型。它允许你从一个现有的类型中“挑选”出某些属性,形成一个新的子集类型。
语法
type Pick<T, K extends keyof T> = {
[P in K]: T[P];
};
作用
Pick
的主要作用是从一个复杂的类型中提取出指定的属性,形成一个新的类型。这在以下场景中非常有用:
-
你需要从一个大类型中提取部分属性来定义一个新的接口或类型。
-
你希望减少代码重复,避免手动定义新的类型。
-
你在处理函数参数或返回值时,只需要部分属性。
示例
假设我们有一个 User
类型:
interface User {
id: number;
name: string;
age: number;
email: string;
}
如果我们只想提取 id
和 name
这两个属性,可以使用 Pick
:
type UserSubset = Pick<User, 'id' | 'name'>;
// 等价于
interface UserSubset {
id: number;
name: string;
}
使用场景
假设你有一个函数,它只需要 User
类型中的部分属性作为参数:
function logUserInfo(user: Pick<User, 'id' | 'name'>) {
console.log(`User ID: ${user.id}, Name: ${user.name}`);
}
// 调用
const user: User = { id: 1, name: 'Alice', age: 30, email: 'alice@example.com' };
logUserInfo({ id: user.id, name: user.name });
通过 Pick
,你可以避免手动定义一个新的接口,同时保持代码的简洁性和可维护性。
备注:
在 TypeScript 的 Pick<User, 'id' | 'name'>
中,|
符号是类型联合运算符。它用于指定从 User
类型中选择的属性名的联合类型,即选择 'id'
或 'name'
这两个属性。
如果要联合三个属性,可以使用 'id' | 'name' | 'age'。在 TypeScript 中,| 符号用于定义联合类型,表示类型可以是多个值中的任意一个。因此,'id' | 'name' | 'age' 表示类型可以是 'id'、'name' 或 'age' 中的任意一个。
作用
|
符号在这里的作用是定义一个联合类型,表示从 User
类型中挑选出的属性名可以是 'id'
或 'name'
中的任意一个。Pick
类型辅助工具会根据这个联合类型创建一个新的类型,该类型只包含 User
类型中被选中的属性。
示例
假设我们有一个 User
类型:
interface User {
id: number;
name: string;
age: number;
email: string;
}
使用 Pick<User, 'id' | 'name'>
会创建一个新类型,该类型只包含 User
类型中的 id
和 name
属性:
type UserSubset = Pick<User, 'id' | 'name'>;
// 等价于
interface UserSubset {
id: number;
name: string;
}
解释
-
Pick<User, 'id' | 'name'>
中的'id' | 'name'
是一个联合类型,表示选择User
类型中的id
或name
属性。 -
Pick
会根据这个联合类型创建一个新的类型,该类型只包含被选中的属性。
使用场景
当你需要从一个复杂的类型中提取部分属性来定义一个新的类型时,Pick
和联合类型 |
非常有用。例如:
function logUserInfo(user: Pick<User, 'id' | 'name'>) {
console.log(`User ID: ${user.id}, Name: ${user.name}`);
}
// 调用
const user: User = { id: 1, name: 'Alice', age: 30, email: 'alice@example.com' };
logUserInfo({ id: user.id, name: user.name });
在这个例子中,logUserInfo
函数只需要 User
类型中的 id
和 name
属性,因此使用 Pick<User, 'id' | 'name'>
来定义参数类型。